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

标签 emacs macros 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)

我错过了什么?

最佳答案

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/

相关文章:

emacs - 在 emacs 模式行中截断任务名称

c++ - 使用默认参数的宏包装函数调用

c - 扩展 C 宏的类型

emacs - js2 模式下的高锁损坏

grails emacs 模式 - "Cannot open load file" "project-mode"

asynchronous - 使用异步调用覆盖函数值

emacs 从原始缓冲区调度帮助窗口

emacs - 为什么在 LISP 中 setq() 时没有出现关于 undefined variable 的错误?

macros - C 预处理器,递归宏

emacs - 在 Emacs 中调整发生窗口的大小