如何使用“部分应用”?
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
返回),则需要使用funcall
或 apply
.
funcall
和 apply
的区别在于 funcall
只是调用带有给定参数的函数,而 apply
将其最后一个参数视为应该附加到参数列表。因此,您的第一个示例需要用 apply
编写,因为 +
不适用于列表:
(apply (apply-partially '+ 1) `(1))
对于第二个示例,使用 funcall
,因为函数参数未包含在列表中:
(let ((addone (apply-partially #'+ 1)))
(funcall addone 2))
我正在尝试在本地上下文中使用部分应用:
((apply-partially '+ 1) `(1))
这给我以下错误:eval: Invalid function: (apply-partially (quote +) 1)
类似地:
(let ((addone (apply-partially #'+ 1)))
(addone 2))
为什么这个例子中的任何一个都不起作用?
这是因为 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))