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のバグらしい.