如何使用“部分应用”?

How to use `apply-partially`?

我正在尝试在本地上下文中使用部分应用:

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

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

类似地:

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

为什么这个例子中的任何一个都不起作用?

这是因为 Emacs Lisp 为变量和函数提供了单独的命名空间。使用 defun 定义的函数可以通过将其名称放在列表的第一位并对其求值来调用,但是如果您有一个函数作为值(由 apply-partially 返回),则需要使用funcallapply.

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

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

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

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