为什么 elisp 宏返回的函数的应用程序不起作用?

发布于 2024-11-16 10:45:42 字数 516 浏览 2 评论 0原文

例如,下面是一个宏:

(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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如梦亦如幻 2024-11-23 10:45:42

Emacs Lisp 需要列表 form 成为内置函数(或 subr),一个 lambda 表达式(即 (lambda LIST . LIST))或 宏 lambda 表达式 (即 <代码>(宏 lambda LIST . LIST))。第一个元素也可以是 符号< /a> 其函数槽包含有效的第一个元素。

(my-macro 2 3) 没有所需的形式,因此它是一个无效函数。

如果你习惯了Scheme,其中函数调用的函数部分被正常评估,请注意,这在Lisp中不能以相同的方式工作,其中函数具有不同的命名空间((f 3)查找f 的函数槽,而 f 的值通常是其值槽)。

如果您想像普通值一样评估函数,可以使用 funcallapply

(funcall (my-macro 2 3) 1)

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 up f's function slot, whereas the value of f is normally its value slot).

If you want to evaluate a function like a normal value, you can use funcall or apply.

(funcall (my-macro 2 3) 1)
无法言说的痛 2024-11-23 10:45:42

正如错误消息所表明的那样,在计算 ((my-macro 2 3) 1) 形式时,Emacs 在计算之前不会扩展 (my-macro 2 3)它是第一个元素的列表。您想说

(funcall (my-macro 2 3) 1)

(eval (list (my-macro 2 3) 1)

类似的话,以便对宏进行求值。

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 say

(funcall (my-macro 2 3) 1)

or

(eval (list (my-macro 2 3) 1)

or something like that, so that the macro gets evaluated.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文