为什么 elisp 宏返回的函数的应用程序不起作用?
例如,下面是一个宏:
(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)
我缺少什么?”
For example, here is a macro:
(defmacro my-macro (x y)
(if (> x 0)
`(lambda (z) (+ z ,y))
`(lambda (z) (+ ,x z))))
and (my-macro 2 3)
returns (lambda (z) (+ z 3))
However, ((my-macro 2 3) 1)
returns an error saying,
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)
What am I missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Emacs Lisp 需要列表 form 成为内置函数(或 subr),一个 lambda 表达式(即
(lambda LIST . LIST)
)或 宏 lambda 表达式 (即 <代码>(宏 lambda LIST . LIST))。第一个元素也可以是 符号< /a> 其函数槽包含有效的第一个元素。(my-macro 2 3)
没有所需的形式,因此它是一个无效函数。如果你习惯了Scheme,其中函数调用的函数部分被正常评估,请注意,这在Lisp中不能以相同的方式工作,其中函数具有不同的命名空间(
(f 3)
查找f
的函数槽,而f
的值通常是其值槽)。如果您想像普通值一样评估函数,可以使用
funcall
或apply
。Emacs Lisp requires the first element of a list form to be a built-in function (or subr), a lambda-expression (i.e.
(lambda LIST . LIST)
) or a macro lambda-expression (i.e.(macro lambda LIST . LIST)
). The first element can also be a symbol whose function slot contains a valid first element.(my-macro 2 3)
doesn't have the required form, so it's an invalid function.If you're used to Scheme, where the function part of a function call is evaluated normally, note that this can't work identically in Lisp where functions have a different namespace (
(f 3)
looks upf
's function slot, whereas the value off
is normally its value slot).If you want to evaluate a function like a normal value, you can use
funcall
orapply
.正如错误消息所表明的那样,在计算
((my-macro 2 3) 1)
形式时,Emacs 在计算之前不会扩展(my-macro 2 3)
它是第一个元素的列表。您想说或
类似的话,以便对宏进行求值。
As the error message makes clear, in evaluating the form
((my-macro 2 3) 1)
, Emacs doesn't expand(my-macro 2 3)
before evaluating the list it's the first element of. You want to sayor
or something like that, so that the macro gets evaluated.