gpt4 book ai didi

lisp - 方案宏是否与变量和函数位于同一 namespace 中?

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:16 26 4
gpt4 key购买 nike

我知道,与 Common lisp 不同,Scheme 为变量和函数提供了一个公共(public)命名空间。但是 macroses 是否也落在那里?

它可以被时间分开,它们存在于其中。但是在编译时,当macroses都是expans时,肯定有一些函数,比如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”始终引用宏。在您的示例中的其他任何地方,“添加”都是指该过程。

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

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

我应该提到一个复杂的问题:如果您首先将“add”定义为顶层过程,然后根据“add”定义一些其他过程,然后再将“add”重新定义为顶层宏,结果没有明确定义,并且会因一个实现而异。同样,如果“add”开始时是顶层宏,后来又被重新定义为过程。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com