什么时候使用"apply"和"funcall"?

Fra*_*rar 16 common-lisp

Common Lisp的HyperSpec说,在funcall条目

(funcall function arg1 arg2 ...) 
==  (apply function arg1 arg2 ... nil) 
==  (apply function (list arg1 arg2 ...))
Run Code Online (Sandbox Code Playgroud)

因为它们在某种程度上是等价的,你什么时候使用apply,什么时候funcall

den*_*nis 23

funcall如果您有一个或多个单独的参数,apply并且您的参数在列表中,则应该使用

(defun passargs (&rest args) (apply #'myfun args))
Run Code Online (Sandbox Code Playgroud)

要么

(defun passargs (a b) (funcall #'myfun a b))
Run Code Online (Sandbox Code Playgroud)


Vij*_*hew 8

apply仅在运行时知道参数列表时才有用,特别是当参数作为列表动态读取时.你仍然可以funcall在这里使用,但你必须从列表中解压缩各个参数,这是不方便的.您也可以使用applyfuncall通过传递参数的方式.它唯一需要的是最后一个参数必须是一个列表:

> (funcall #'+ 1 2)
3
> (apply #'+ 1 2 ())
3
Run Code Online (Sandbox Code Playgroud)