感谢您帮助理解此处所述案例中程序与宏之间行为的差异。
情况1(程序)
(define bar (lambda (x) (foo x))) ; closure of 'bar' contains top-level...
; ... environment where 'foo' is not bound yet
;
(define foo (lambda (x) (* x 4))) ; now, 'foo' is bound in top-level environment
;
(bar 2) ; ==> 8 ; when this line is evaluated, 'foo' is available in ...
; ... the top-level environment, so in the closure of 'bar'
这对我来说似乎很合理。
情况2(宏观)
让我们尝试使用宏而不是第二行中的过程:
(define bar (lambda (x) (foo x))) ; closure of 'bar' contains...
; ... top-level environment where 'foo' is not bound yet
;
(define-syntax foo
(syntax-rules ()
((foo arg1) (* 4 arg1)))) ; I thought that 'foo' was bound in...
; ... top-level environment to the macro
;
(bar 2) ; ==> ERROR: reference to undefined identifier: foo
我不明白错误。为什么在评估(条形图2)而不是绑定“foo< - >宏”时它是在顶级环境中,所以在“条形图”的关闭中
交换第1行和第2行可以解决问题,但我不明白为什么:
(define-syntax foo
(syntax-rules ()
((foo arg1) (* 4 arg1))))
;
(define bar (lambda (x) (foo x)))
;
(bar 2) ; ==> 8
提前感谢您的帮助! : - )
您诚挚的,
尼古拉斯
答案 0 :(得分:1)
在工作版本中,由于宏已经定义,系统将扩展宏,因此您可以有效地获得:
(define bar (lambda (x) (* 4 x)))
但是,在非工作版本中,宏尚未定义,并且不会扩展。在运行时,bar
函数需要查找不存在的foo
过程。