Emacs 如何使用“部分应用”?
我试图在本地上下文中部分使用apply: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-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))
完美答案。谢谢,完美的答案。非常感谢。