海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
「ナイーブな実装」というのは、これより数段まともなものを指すに違いない。
ともかく、
(define-syntax let (syntax-rules () ((let ((name val) ...) body1 body2 ...) ((lambda (name ...) body1 body2 ...) val ...)))) (let ([x 42] [y 100] [z (* 3 3)]) (display (* x y z)) (display "\n"))
が動くようになりました。
ところで、上の let の定義は R5RS に書かれているものの一部なんですが、 どうして body1 body2 と二つかかれているのか不思議だったんですよねー(←素人)。
これは、「body は一個以上必要」というのを表現しているんですね。 パターン言語の説明を読んで、なっとく。
まだいろいろいい加減なのにくわえ、まだ健全じゃない。 マクロを展開した結果が lambda になったときに、 束縛変数のリネーム処理を行ってやれば良いんじゃないかと思っている。
ところで、マクロつくりたてほやほやの iscm0 で
(let ([a 1] [b (/ 3 0)]) (display a) (display "\n"))
を実行しようとすると「ゼロでわったよ」と言って止まるんだけど*1、 gauche は平気そうだ!……遅延評価?!
一瞬うろたえたんですが、もちろん、んなわきゃなかった。
gosh> (display (/ 1 0)) #i1/0#<undef> gosh>
*1 iscm は「Integer くらいしか扱えないスキーム(笑い)」の略ですからなぁ、わっはっは。