海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
SICP 練習 1.6 相当
(define-syntax if (syntax-rules () ((if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))))) (if (= 1 1) (display "eq1\n") (display "neq1\n")) (define new-if (lambda (predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause)))) (new-if (= 1 1) (display "eq2\n") (display "neq2\n"))
これを実行してみましょう。
% iscm0 < ex1_6mod.scm eq1 eq2 neq2
マクロで書かれた方の if は、ちゃんと特殊形式になっていて、 意図通りの動作となっています。 (iscm0 では、cond が built-in な特殊形式となっています。 if じゃなくて cond の方を組み込みにしたのは、僕が cond の方が好きだから! ってか、僕は if なんて使わない (使えない))
よかった。
一見まともに動いている iscm0 のマクロですが、 ちょっと想定から外れたコードを食わせると死亡するので、 その辺をまともに*1 していこう。
でもって、健全に*2する!
あ、そういや、syntax-rules のリテラル部の働きがよーわかってない。 Hygienic にするための処理にかかわってんじゃないかと思っているんだけど、 理解しようとすること自体を後回しにしている。