我试图在本地环境中使用apply-partial:
((apply-partially '+ 1) `(1))
这给我以下错误:eval: Invalid function: (apply-partially (quote +) 1)
(let ((addone (apply-partially #'+ 1)))
(addone 2))
为什么这个例子不起作用?
答案 0 :(得分:4)
那是因为Emacs Lisp为变量和函数分别设置了名称空间。使用defun
定义的函数可以通过将其名称放在列表中并进行评估来调用,但如果您将函数作为值(由apply-partially
返回),则需要使用funcall
或apply
。
funcall
和apply
之间的区别在于funcall
只是使用给定的参数调用函数,而apply
将其最后一个参数视为应附加的列表到参数列表。因此,您的第一个示例需要使用apply
编写,因为+
不适用于列表:
(apply (apply-partially '+ 1) `(1))
对于第二个示例,请使用funcall
,因为函数参数未包含在列表中:
(let ((addone (apply-partially #'+ 1)))
(funcall addone 2))