我知道,与 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)会发生什么?是函数调用还是宏扩展?