我今天在玩宏,看到 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