我可以将属性列表作为& key参数传递给函数吗?

时间:2017-07-03 22:34:48

标签: common-lisp

是否有办法以与此类似的方式将属性列表作为参数传递给函数:

(defun sum (&key x y) (+ x y))
(sum '(:x 10 :y 20))

1 个答案:

答案 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(五十)。