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