scheme

Collatz 予想 (キミならどう書く 2.0 - ROUND 2 -)

時間ができたので考えてみた。そのまま素直に書いてみた。 #!/usr/bin/env gosh (define (g n) (define (f n step) (cond ((= n 1) step) ((even? n) (f (/ n 2) (+ step 1))) ((odd? n) (f (+ (* n 3) 1) (+ step 1))))) (f n 1)) (define (h n) (let loop …

define-syntax でユニットテスト

結城さんが define-syntax を使った debug マクロ(デバッグプリント - 結城浩のSICP日記 - sicp)を紹介されている。マクロの便利な使い方の好例だと思う。Scheme ではなく、Common Lisp の話になってしまうが、高い評価を受けている Practical Common Lisp…

for

Scheme だとあまり使う場面はないだろうけど、普通の for 文が使いたかったので書いた。一応残しておく。 (define-syntax for (syntax-rules () ((_ (var start end) body ...) (do ((var start (+ 1 var))) ((= var end)) body ...))))実行例。 gosh> (for …

Gauche の拡張ライブラリでクラスを定義する

Gauche の拡張ライブラリで、自分でクラスを定義する方法、というよりメモとしてのテンプレート。正しい手順か不明だけど、とりあえず動く。安直だけど、"clos" という名前の拡張ライブラリを書くとして、Scheme で書くと次のような定義になるようにする。 (…

パラメータ用ミニマクロ

gauche.parameter を使うときにちょっと楽できるように。 (define-syntax define-parameter (syntax-rules () ((_ var expr) (define var (make-parameter expr))))) (define-syntax with-parameter (syntax-rules () ((_ (param ...) body ...) (let ((para…

with-slots (2)

引き続き、define-syntax を使った with-slots マクロの定義について。昨日の shiro さんのコメントを受けて修正しつつ、Common Lisp の with-slots の仕様に近づくように修正。以下のサンプルコードを用意。 (define-class <person> () ((name :init-keyword :name)</person>…

with-slots

Common Lisp にある with-slots を Gauche でも使ってみる。次のクラスがあったとき、 (define-class <person> () ((name :init-keyword :name) (gender :init-keyword :gender) (age :init-keyword :age)))こんなふうに使えるようにする。 ;; Example-1 (let ((hoge</person>…

Gauche を C プログラムから使う

libgauche をリンクすればできるみたい。http://www.practical-scheme.net/wiliki/wiliki.cgi?Gauche%3AYAGHG%3AIntroduction を参考に、外部の scheme コードをロードして結果を表示するプログラムを書いてみた。 main.c で同じディレクトリにある test.scm…

マクロを使ったジェネリック関数宣言の一例

x, y 座標をスロットに持つ vec クラスを考える。Common Lisp では次のような定義になる。 (defclass vec () ((x :initarg :x :initform 0d0 :accessor vec-x) (y :initarg :y :initform 0d0 :accessor vec-y)))ついでに factory も定義しておく。 (defun ma…

「http://www.yotabanana.com/lab/20060120.html#p01」の Ruby スクリプトを Scheme で書いたらどうなるか。ただの翻訳ではつまらないので、クロージャも取り混ぜてみる。 #!/usr/bin/env gosh ;; カウンタクロージャを保管する (define *counters* (make-ha…