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

Macros 这两个方案代码(宏)有什么区别,macros,scheme,Macros,Scheme,我试着通过玩我在中找到的一些代码来理解。 关于sc宏转换器的一段代码: (define-syntax let1 (sc-macro-transformer (lambda (form env) (let ((id (cadr form)) (init (caddr form)) (exp (cadddr form))) `((lambda (,id

我试着通过玩我在中找到的一些代码来理解。 关于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
但我想知道我是否可以从` lambda'中扮演句法闭包的角色。。。到…的身体。。该计划变成:

(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

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

您的问题可能是:

(make-syntactic-closure env '(id) (cadddr form)))
将其与以前的版本进行比较


您可能希望改为列表id。

您的问题可能是:

(make-syntactic-closure env '(id) (cadddr form)))
将其与以前的版本进行比较


您可能希望它是列表id。

这只是一个猜测,没有运行MIT scheme,但是在提升代码时,您将列表id转换为'id',这不是一回事。列表id每次展开宏时,都会创建一个新列表,该列表的符号由标识符id绑定,即cadr表单。但是,'id是符号id的文字列表。因此,let1将列表id扩展为'a,而let1错误将其扩展为'id'。您应该能够通过宏扩展过程来检查这一点,尽管我不知道这具体适用于MIT scheme。这只是一个猜测,不运行MIT scheme,但在提升代码时,您将列表id转换为'id,这不是一回事。列表id每次展开宏时,都会创建一个新列表,该列表的符号由标识符id绑定,即cadr表单。然而,'id是符号id的文本列表。因此,let1将列表id扩展为'a,而let1错误将其扩展为'id'。您应该能够通过宏扩展过程来检查这一点,尽管我不知道这对于MIT scheme来说是什么。