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
有人可以告诉我为什么这两个程序是不同的?
这只是一个没有运行MIT方案的猜测,但是将您翻译的代码(列表id)提升为'(id),这不是同一件事。 (列表ID)每次扩展宏时创建具有由标识符ID(即,(cadr形式))绑定的符号的新列表。但是,'(id)是符号“id”的文字列表。因此let1将(列表id)展开为'(a),而let1-error展开为'(id)。你应该能够用宏扩展程序来检查这个,但我不知道MIT的方案具体是什么。 –