make-syntactic-closure の練習
(define-syntax alet1 (sc-macro-transformer (lambda (expr use-env) (let ((it-expr (cadr expr)) (var (caddr expr)) (expr1 (cadddr expr)) (body (car (cddddr expr)))) `(let ((it ,(make-syntactic-closure use-env '() it-expr)) (,var ,(make-syntactic-closure use-env '() expr1))) ,(make-syntactic-closure use-env `(it ,var) body)))))) (let ((x 7)) (alet1 42 print (lambda (x) (display x) (newline)) (begin (print it) (print x) (let ((it 23)) (print it)))))
42 7 23
一発でうまく書くことはできなかった…
body の free-names に '(it)
を指定することで use-env でもなく mac-env でもなくマクロから生で挿入した it
が見えるようになる…ということなのか?
(9/28 11:00修正&追記)
Twitterで @dico_leque さんにbodyのsyntactic closureにvarも指定しないといけないとご指摘を頂いたのに,こっちを編集するのを忘れていた.修正 '(it)
=> `(it ,var)
chibi-schemeではなくても動いてしまったのだけど,どうやらchibi-schemeのバグらしい.