2
私はMIT-Scheme documentationで見つけたコードで遊んで理解しようとしています。 SC-マクロ変圧器に関するコードの一枚:これら二つのスキームの違いは何ですか?コード(マクロ)
(define-syntax let1
(sc-macro-transformer
(lambda (form env)
(let ((id (cadr form))
(init (caddr form))
(exp (cadddr form)))
`((lambda (,id)
,(make-syntactic-closure env (list id) exp))
,(make-syntactic-closure env '() init))))))
;(let1 a 1 (+ a 1))
;Value: 2
が、私はラムダ `から「メイク構文閉鎖」の一部を取ることができれば...ましょう「のボディに私が疑問に思います.. "となり、プログラムは次のようになります。
(define-syntax let1-error
(sc-macro-transformer
(lambda (form env)
(let ((id (cadr form))
(init (make-syntactic-closure env '() (caddr form)))
(exp (make-syntactic-closure env '(id) (cadddr form))))
;; (pp `(id:,id))
;; (pp `(init:, init))
;; (pp `(exp:, exp))
`((lambda (,id)
,exp)
,init)))))
;(let1-error a 1 (+ a 1))
;Unbound variable: a
誰かが私にこれら2つのプログラムが異なる理由を教えてもらえますか?
これは、MITスキームを実行しないで、推測したものですが、翻訳したコード(リストid)を '(id)'に持ち上げる際に同じものではありません。 (list id)は、マクロが展開されるたびに識別子id、つまり(cadr形式)でバインドされたシンボルで新しいリストを作成します。しかし、 '(id)はシンボル "id"のリテラルリストです。したがって、let1は(list id)を '(a)に展開し、let1-errorはそれを'(id)に展開します。私はMITスキームのためにそれが何であるかは分かりませんが、マクロ展開プロシージャでこれを確認することができます。 –