【问题标题】:Are scheme macroses in the same namespace with variables and functions?方案宏是否与变量和函数在同一个命名空间中?
【发布时间】:2013-01-11 11:52:18
【问题描述】:

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

【问题讨论】:

    标签: lisp scheme


    【解决方案1】:

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

    在“let-syntax”的正文中,“add”始终指代宏。在您的示例中的其他任何地方,“添加”都是指过程。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2010-11-04
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多