2

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

4

1 回答 1

2

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

在你的 ' let-syntax' 体内,' add' 总是指宏。在您的示例中的其他任何地方,“添加”都是指该过程。

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

  1. ' syntax' 表达式不正确;它应该是(syntax (+ a ...))
  2. 在您对“reduce-left”的调用中,将宏“add”作为参数传递给过程是错误的。

我应该提到一个复杂的情况:如果您首先将' add'定义为顶级过程,然后根据'add'定义一些其他过程,然后再将'add'重新定义为顶级宏,结果定义不明确并且会因一种实现而异。类似地,如果“添加”以顶级宏开始,后来被重新定义为过程。

于 2013-01-28T08:16:30.273 回答