什么是宏观功能?

时间:2013-07-12 14:31:38

标签: macros common-lisp sbcl

今天我正在玩宏,并且看到术语宏功能出现在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

我已阅读this from the CLHS,但无法理解它是什么以及它做了什么

非常感谢任何帮助阐明宏观功能的目的。

[编辑] 从阅读this看,该函数实现了扩展?嗯,这是有道理的,因为宏实际上只是一个在宏扩展时运行的函数(并导致代码),但如果这是正确的,那么“具有宏功能的宏”的术语

我感觉很亲密,但我还是不太明白

[再次编辑] 好的,看看definition for macro我得到了这个

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

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

[编辑更多] 鉴于上述情况,CLHS entry for defmacro似乎有道理。是否有人能够确认我是否在这里正确的轨道,如果有可能有一个没有宏功能的宏,如果没有那么我不明白为什么它指定它是一个'宏的事实用宏功能'

[最终编辑] 宏是一个符号,功能槽绑定到宏功能? (这个措辞是垃圾,我可以在这里帮忙!)

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

1 个答案:

答案 0 :(得分:7)

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

另见my answer to another question