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)
我错过了什么?
Emacs Lisp要求列表形式的第一个元素是内置函数(或subr),lambda表达式(即(lambda LIST . LIST)
)或宏lambda表达式(即(macro lambda LIST . LIST)
).第一个元素也可以是一个符号,其功能槽包含有效的第一个元素.
(my-macro 2 3)
没有所需的表格,所以这是一个无效的功能.
如果您已经习惯了函数调用的函数部分正常计算,请注意,在函数具有不同命名空间的Lisp中,这不能完全相同((f 3)
查找f
函数槽,而值f
通常是它的价值槽).
如果要评估像普通值这样的函数,可以使用funcall
或apply
.
(funcall (my-macro 2 3) 1)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
480 次 |
最近记录: |