make-syntactic-closure の free-names のイメージ
(make-syntactic-closure environment free-names form)
の free-names は,let
で包むイメージでいいんだろうか.
(let ((x 1)) (let-syntax ((foo (sc-macro-transformer (lambda (expr env) (let ((var (cadr expr))) (make-syntactic-closure var (list var) env)))))) (let ((x 2)) (foo x))))
↓foo
展開のイメージ
(let ((x@1 1)) (let-syntax ((foo (sc-macro-transformer (lambda (expr env) (let ((var (cadr expr))) (make-syntactic-closure var (list var) env)))))) (let ((x@2 2)) (let ((x@2 x@1)) x@2))))
あるいは,マクロ定義時の環境が透けて見えるイメージ?
下のコード,コメントはchibi-schemeでの実行結果.
(let ((print (lambda (x) (display x) (newline))) (x 1)) (let-syntax ((foo (sc-macro-transformer (lambda (expr env) (let ((var (cadr expr))) `(begin (print ,var) ; 1 (print ,(make-syntactic-closure env '() var)) ; 2 (print ,(make-syntactic-closure env '(x) var)) ; 1 (print ,(make-syntactic-closure env (list var) var)) ; 1 )))))) (let ((x 2)) (foo x))))