7

我今天在玩宏,看到 REPL 中出现了宏功能这个术语。我熟悉宏、编译器宏和阅读器宏,但没有遇到过这些。

CL-USER> (defmacro fnaa (&rest rest) `(lambda ,@rest))
  FNAA

CL-USER> #'fnaa
  #<CLOSURE (LAMBDA (&REST SB-C::ARGS) :IN MACRO-FUNCTION) {1003A6DD6B}>

我检查了'fnaa并得到了这个:

#<SYMBOL {1003A40A5F}>
--------------------
Its name is: "FNAA"
It is unbound.
It a macro with macro-function: #<FUNCTION (MACRO-FUNCTION FNAA) {1003A610BB}>
It is internal to the package: COMMON-LISP-USER 
Property list: NIL

我从 CLHS上读过这篇文章,但不明白它是什么以及它的作用

任何阐明宏功能目的的帮助将不胜感激。

[编辑] 从阅读中看来,函数实现了扩展?好吧,这是有道理的,因为宏实际上只是一个在宏扩展时运行的函数(并产生代码),但是如果这是正确的,那么为什么要使用“具有宏功能的宏”的术语呢?

我感觉很接近,但我还是不太明白

[再次编辑] 好的,看看宏的定义我明白了

macro n. 1. a macro form 2. a macro function. 3. a macro name. 

那么宏是这些的组合,因此宏功能只是实现吗?

[编辑更多] 鉴于上述情况,defmacro 的CLHS 条目似乎是有道理的。任何人都可以确认我是否在正确的轨道上,以及是否可以有一个没有宏功能的宏,如果没有,那么我不明白为什么它指定它是一个'宏具有宏功能'

[最终编辑] 宏是函数槽绑定到宏函数的符号吗?(这个措辞是废话,我可以在这里得到帮助!)

CL-USER> (setf (macro-function 'jam) (lambda (x y) nil))

检查'果酱

#<SYMBOL {100400317F}>
--------------------
Its name is: "JAM"
It is a global variable bound to: NIL [unbind]
It a macro with macro-function: #<FUNCTION (LAMBDA (X Y)) {1005522FAB}> [unbind]
It is internal to the package: COMMON-LISP-USER [export] [unintern]
Property list: NIL
4

1 回答 1

7

是的,macro-function是在宏扩展期间在代码上调用并实现宏的函数。

另请参阅我对另一个问题的回答

于 2013-07-12T15:15:16.653 回答