方案宏是否在具有变量和函数的同一名称空间中?

时间:2013-01-28 07:00:36

标签: lisp scheme

我知道,与Common lisp不同,Scheme有一个用于变量和函数的通用命名空间。但宏观也会落在那里吗?

它可以按时间分开,它们存在。但是在编译时,当宏是全部扩展时,肯定会有一些函数,比如list或cons,因此存在运行时和编译时。

然后我可以写下以下内容:

(define (add a b) (+ a b))

(let-syntax ((add (lambda (x)
                    (syntax-case x ()
                      ((_ a ...) (syntax + a ...))))))
   (display (add 1 2 3))
   (display (reduce-left add 0 '(1 2 3))))

得到6 6?或者,反之亦然,定义宏,然后定义函数?而在这样的表达中:(加1 2)会发生什么?它会是函数调用还是宏扩展?

1 个答案:

答案 0 :(得分:2)

是的,变量和宏位于同一名称空间中。 (我没有提到过程,因为它们只是可以存储在变量中的值,如数字或字符串。)

在“let-syntax”的正文中,“add”总是指宏。在你的例子的其他地方,'add'指的是程序。

请注意,您的代码中存在两个错误:

  1. syntax”表达式不正确;它应该是(syntax (+ a ...))
  2. 在您对'reduce-left'的调用中,将宏'add'作为参数传递给过程是错误的。
  3. 我应该提一个复杂因素:如果你首先将'add'定义为一个顶级过程,那么用'add'来定义一些其他过程,然后再将'add'重新定义为一个顶层宏,结果没有明确定义,并且会因实施而异。同样,如果'add'作为顶级宏开始,稍后重新定义为过程。