这两个方案代码之间有什么区别(宏)

时间:2011-03-14 21:19:33

标签: macros scheme

我尝试通过玩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

有人能告诉我为什么这两个程序不同?

1 个答案:

答案 0 :(得分:0)

你的问题很可能出现在:

(make-syntactic-closure env '(id) (cadddr form)))

将其与之前的版本进行比较。

您可能希望改为(list id)