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

use*_*148 8 emacs macros elisp

例如,这是一个宏:

(defmacro my-macro (x y)
  (if (> x 0) 
  `(lambda (z) (+ z ,y))
`(lambda (z) (+ ,x z))))
Run Code Online (Sandbox Code Playgroud)

(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)
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Gil*_*il' 7

Emacs Lisp要求列表形式的第一个元素是内置函数(或subr),lambda表达式(即(lambda LIST . LIST))或宏lambda表达式(即(macro lambda LIST . LIST)).第一个元素也可以是一个符号,其功能槽包含有效的第一个元素.

(my-macro 2 3) 没有所需的表格,所以这是一个无效的功能.

如果您已经习惯了函数调用的函数部分正常计算,请注意,在函数具有不同命名空间的Lisp中,这不能完全相同((f 3)查找f函数槽,而值f通常是它的价值槽).

如果要评估像普通值这样的函数,可以使用funcallapply.

(funcall (my-macro 2 3) 1)
Run Code Online (Sandbox Code Playgroud)