我尝试通过玩MIT-Scheme documentation中找到的一些代码来理解。 关于sc-macro-transformer的一段代码:
(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
但我想知道我是否可以将“ make-syntactic-closure ”从“lambda ...”转移到“let ..”的主体,程序变为:
(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
有人能告诉我为什么这两个程序不同?
答案 0 :(得分:0)
你的问题很可能出现在:
(make-syntactic-closure env '(id) (cadddr form)))
将其与之前的版本进行比较。
您可能希望改为(list id)
。