我知道,与 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?或者,反之亦然,定义宏,然后定义函数?在这样的表达中: (add 1 2) 会发生什么?是函数调用还是宏扩展?
最佳答案
是的,变量和宏位于同一命名空间中。 (我没有提到过程,因为它们只是可以存储在变量中的值,例如数字或字符串。)
在“let-syntax
”主体中,“add
”始终引用宏。在示例中的其他地方,“add”指的是该过程。
请注意,您的代码中有两个错误:
- “
syntax
”表达式不正确;它应该是(syntax (+ a ...))
。 - 在调用“reduce-left”时,将宏“add”作为参数传递给过程是错误的。
我应该提到一个复杂的情况:如果您首先将“add
”定义为顶级过程,然后根据“add”定义一些其他过程,然后将“add”重新定义为一个顶级宏,结果没有明确定义,并且会因一个实现而异。类似地,如果“add”最初是一个顶级宏,后来被重新定义为一个过程。
关于lisp - 方案宏是否与变量和函数位于同一命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14557006/