是否有办法以与此类似的方式将属性列表作为参数传递给函数:
(defun sum (&key x y) (+ x y))
(sum '(:x 10 :y 20))
答案 0 :(得分:9)
要使用来自列表的参数调用函数,请使用APPLY:
CL-USER > (apply #'sum '(:x 10 :y 20))
30
这也有效:
CL-USER > (apply #'sum :x '(10 :y 20))
30
CL-USER > (apply #'sum :x 10 '(:y 20))
30
CL-USER > (apply #'sum :x 10 :y '(20))
30
CL-USER > (apply #'sum :x 10 :y 20 '())
30
请注意,变量call-arguments-limit
仍然适用。实现支持的函数调用中的参数数量通常是有限的。因此,应用具有长参数列表的函数可能不起作用。请注意,例如在ABCL中,此值仅为50(五十)。