CL的apply,funcall及其参数

apply/funcall function &rest args+

apply可以接受多个参数,但最后一个参数必须是list,其中每个元素是function的参数

funcall也可以接受多个参数,均为function的参数,适用于参数长度已知的情况

关系为: 

 (funcall function arg1 arg2 ...)
 ==  (apply function arg1 arg2 ... nil)
 ==  (apply function (list arg1 arg2 ...))

 

它们的第一个参数必须是function,不能是macro和special operators。

比如and/or,它们一方面是macro,另一方面采用的计算方式是short circuiting,即遇到第一个nil/T就可以得到结果,这与

apply/funcall的求值过程不符。因为apply/funcall均是普通函数,必须先求出所有参数的值再让function处理。

 

在apply中使用and/or的一种替代的方式是使用函数EVERY 和 SOME,如(apply #'and *list*)可以写为如下形式:(every #'identity *list*)

你可能感兴趣的:(REST)