例如,这是一个宏:
(defmacro my-macro (x y)
(if (> x 0)
`(lambda (z) (+ z ,y))
`(lambda (z) (+ ,x z))))
和
(my-macro 2 3)
返回 (lambda (z) (+ z 3))
然而,
((my-macro 2 3) 1)
返回一个错误说, Debugger entered--Lisp error:
(invalid-function (my-macro 2 3))
((my-macro 2 3) 1)
eval(((my-macro 2 3) 1))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp nil nil)
我错过了什么?
最佳答案
Emacs Lisp 需要列表的第一个元素 form成为一个内置函数(或 subr),一个 lambda-expression (即 (lambda LIST . LIST)
)或 macro lambda-expression (即 (macro lambda LIST . LIST)
)。第一个元素也可以是 symbol其函数槽包含有效的第一个元素。(my-macro 2 3)
没有所需的形式,所以它是一个无效的函数。
如果您习惯了 Scheme,其中函数调用的函数部分被正常评估,请注意这在 Lisp 中不能完全相同,因为函数具有不同的命名空间( (f 3)
查找 f
的函数槽,而f
的值通常是它的值槽)。
如果你想像正常值一样评估一个函数,你可以使用 funcall
or apply
.
(funcall (my-macro 2 3) 1)
关于emacs - 为什么elisp宏返回的函数的应用不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432966/