顶级环境中的程序与宏

时间:2011-04-20 17:10:54

标签: macros scheme closures environment

感谢您帮助理解此处所述案例中程序与宏之间行为的差异。

情况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

提前感谢您的帮助! : - )

您诚挚的,

尼古拉斯

1 个答案:

答案 0 :(得分:1)

在工作版本中,由于宏已经定义,系统将扩展宏,因此您可以有效地获得:

(define bar (lambda (x) (* 4 x)))

但是,在非工作版本中,宏尚未定义,并且不会扩展。在运行时,bar函数需要查找不存在的foo过程。