Emacs 如何使用“部分应用”?

Emacs 如何使用“部分应用”?,emacs,elisp,Emacs,Elisp,我试图在本地上下文中部分使用apply: ((apply-partially '+ 1) `(1)) 这给了我以下错误:eval:Invalid function:(部分应用(引号+)1) 同样地: (let ((addone (apply-partially #'+ 1))) (addone 2)) 为什么这个示例不起作用?这是因为Emacs Lisp为变量和函数提供了单独的名称空间。使用defun定义的函数可以通过将其名称放在列表的第一位并对其求值来调用,但如果您将函数作为值(由部分

我试图在本地上下文中部分使用apply:

((apply-partially '+ 1) `(1))
这给了我以下错误:
eval:Invalid function:(部分应用(引号+)1)

同样地:

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

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

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

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

(apply (apply-partially '+ 1) `(1))
对于第二个示例,请使用
funcall
,因为函数参数未包装在列表中:

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

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

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

(apply (apply-partially '+ 1) `(1))
对于第二个示例,请使用
funcall
,因为函数参数未包装在列表中:

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

完美答案。谢谢,完美的答案。非常感谢。