Macros 这两个方案代码(宏)有什么区别
我试着通过玩我在中找到的一些代码来理解。 关于sc宏转换器的一段代码: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
(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来说是什么。