【发布时间】:2014-08-24 19:28:40
【问题描述】:
我正在为函数/宏组合编写宏(可以混合组合)。在宏内部,我必须以不同的方式处理表示函数的符号和命名宏的符号。这是因为结果函数必须使用任意数量的参数(如果组合中的“最低”函数可以),我不能将apply 应用于宏。我的问题:如何确定给定符号代表什么:函数还是宏?
【问题讨论】:
标签: macros lisp common-lisp symbols function-composition
我正在为函数/宏组合编写宏(可以混合组合)。在宏内部,我必须以不同的方式处理表示函数的符号和命名宏的符号。这是因为结果函数必须使用任意数量的参数(如果组合中的“最低”函数可以),我不能将apply 应用于宏。我的问题:如何确定给定符号代表什么:函数还是宏?
【问题讨论】:
标签: macros lisp common-lisp symbols function-composition
宏:
CL-USER 8 > (macro-function 'bar)
NIL
CL-USER 9 > (macro-function 'lambda)
#<Function LAMBDA 41100B7E94>
功能:
CL-USER 15 > (and (fboundp '+)
(not (macro-function '+))
(not (special-operator-p '+)))
T
【讨论】:
macro-function 与宏一起使用时,它会返回类似于#<COMPILED-FUNCTION ...> 的内容,因此宏只是一种特殊的函数。是这样吗?如果它们是函数,为什么我们不能使用apply?
if 在我的情况下很有用)。
(apply (macro-function '...) ...)或(funcall (macro-function '...) ...)。例如,(funcall (macro-function 'lambda) '(lambda () 42) nil) => #'(LAMBDA () 42)。 macroexpand 和 macroexpand-1 可能没有做任何不同的事情。您不能直接使用apply 或funcall 的原因是apply 和funcall 采用函数指示符——函数或带有符号函数的符号。 (macro-function 'cond) 可能有非 nil,但 (symbol-function 'cond) 是 nil,所以你不能 (funcall 'cond …)。