lisp - 方案宏是否与变量和函数位于同一命名空间中?

标签 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?或者,反之亦然,定义宏,然后定义函数?在这样的表达中: (add 1 2) 会发生什么?是函数调用还是宏扩展?

最佳答案

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

在“let-syntax”主体中,“add”始终引用宏。在示例中的其他地方,“add”指的是该过程。

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

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

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

关于lisp - 方案宏是否与变量和函数位于同一命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14557006/

相关文章:

lisp - 创建映射的固有方法,以便可以传递向量的每个元素以及标量

emacs - 我可以使用来自同一个 emacs 的两种不同的 lisp+slime/swanks 吗?

lisp - 普通口齿不清 : getting all keys of a given hash table as a list

lisp - 在 Lisp 中组合 2 个列表

scheme - 将符号定义为其他符号时,方案中发生了什么?

list - 方案高阶函数 - GPA 计算器

scheme - 如何在Scheme中进行模式匹配?

functional-programming - 函数式程序——写一个函数从中间重新排列一个数组

scheme - 如何在 guile 中创建 cairo 曲面

lisp - 在 Common Lisp 中使用标签