如何使用`apply-partially`?

时间:2015-09-22 10:01:38

标签: emacs elisp

我试图在本地环境中使用apply-partial:

((apply-partially '+ 1) `(1))

这给我以下错误:eval: Invalid function: (apply-partially (quote +) 1)

同样地:

(let ((addone (apply-partially #'+ 1)))
  (addone 2))

为什么这个例子不起作用?

1 个答案:

答案 0 :(得分:4)

那是因为Emacs Lisp为变量和函数分别设置了名称空间。使用defun定义的函数可以通过将其名称放在列表中并进行评估来调用,但如果您将函数作为值(由apply-partially返回),则需要使用funcallapply

funcallapply之间的区别在于funcall只是使用给定的参数调用函数,而apply将其最后一个参数视为应附加的列表到参数列表。因此,您的第一个示例需要使用apply编写,因为+不适用于列表:

(apply (apply-partially '+ 1) `(1))

对于第二个示例,请使用funcall,因为函数参数未包含在列表中:

(let ((addone (apply-partially #'+ 1)))
  (funcall addone 2))