macros - 什么是宏功能?

标签 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似乎有道理。任何人都可以确认我是否在正确的轨道上,以及是否可以有一个没有宏功能的宏,如果没有,那么我不明白为什么它指定它是一个'宏具有宏功能'

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

最佳答案

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

另见 my answer to another question .

关于macros - 什么是宏功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617348/

相关文章:

c - SBCL存储大图的效率如何?

memory - 在 Common Lisp (SBCL) 中处理和最小化内存使用

macros - SBCL Common Lisp 实现中何时以及多久发生一次宏扩展?

macros - 如何在 sbcl common lisp 中的 let 绑定(bind)中定义(defmacro)宏?

lisp - 是否有一个简单的 lisp 等效于 Python 的生成器?

ios - Objective-C 中的宏调用 isEqualToString : produces error about invalid token

common-lisp - 如何执行一个普通的 lisp 文本文件(clozure cl)?

regex - Common Lisp 将类似正则表达式的模式应用于 PLIST 中的键

c++ - 宏 C/C++ 的奇怪行为

macros - 如何将//或“传递到宏替换中