我知道,与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)会发生什么?它会是函数调用还是宏扩展?
答案 0 :(得分:2)
是的,变量和宏位于同一名称空间中。 (我没有提到过程,因为它们只是可以存储在变量中的值,如数字或字符串。)
在“let-syntax
”的正文中,“add
”总是指宏。在你的例子的其他地方,'add'指的是程序。
请注意,您的代码中存在两个错误:
syntax
”表达式不正确;它应该是(syntax (+ a ...))
。我应该提一个复杂因素:如果你首先将'add
'定义为一个顶级过程,那么用'add'来定义一些其他过程,然后再将'add'重新定义为一个顶层宏,结果没有明确定义,并且会因实施而异。同样,如果'add'作为顶级宏开始,稍后重新定义为过程。