例如,这是一个宏:

(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/

10-11 06:56