GaucheのArc化計画
実は単にマクロの練習としてArcを題材にしただけ。
Arc版if
3つ以上の引数が渡せてelseifの処理が書ける
(define-syntax if (syntax-rules () ((_ a) a) ((_ a b . c) (cond (a b) (else (if . c))))))
実行例
gosh> (if #f (print 1) #f (print 2) (print 3)) 3 #<undef>
Arc版let
ローカル変数が1つしか作れないかわりに括弧を書かなくていい
(define-syntax letm (syntax-rules () ((_ k v . body) ((lambda (k) . body) v))))
実行例
gosh> (letm x 2 (+ x x)) 4
Arc版with
ローカル変数が複数作れて括弧が普通のletより少ない
(define-syntax with (syntax-rules () ((_ ((ks vs)) . body) ((lambda ks . body) . vs)) ((_ ((ks vs) k v . kv) . body) (with (((k . ks) (v . vs)) . kv) . body)) ((_ kv . body) (with ((() ()) . kv) . body))))
実行例
gosh> (with (x 1 y 2) (+ x y))) 3