在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)
apply仅在运行时知道参数列表时才有用,特别是当参数作为列表动态读取时.你仍然可以funcall在这里使用,但你必须从列表中解压缩各个参数,这是不方便的.您也可以使用apply像funcall通过传递参数的方式.它唯一需要的是最后一个参数必须是一个列表:
> (funcall #'+ 1 2)
3
> (apply #'+ 1 2 ())
3
Run Code Online (Sandbox Code Playgroud)