说我有一个函数foo:
(defun foo (x y &rest args)
...)
我后来想用功能栏包装它:
(defun bar (x &rest args)
(foo x 100 args))
然后假设bar是这样调用的:(bar 50 1 2 3)
使用此设置,args是包含尾随参数的条形体内的列表,因此当我将其传递给foo时,而不是等同于(foo 50 100 1 2 3)
我当然得到(foo 50 100 '(1 2 3))
。如果这些是宏,我会在条形体内使用``(foo,x 100,@ args)`将args拼接到函数调用中。 ,@只能在引用引号列表中使用。
如何在常规函数中进行相同类型的拼接?
答案 0 :(得分:32)
APPLY将使用其后续参数调用其第一个参数,并且最后一个参数必须是列表。所以:
(apply #'foo x 100 args)
答案 1 :(得分:0)
这种方法很慢,但它可能是您正在寻找的。 p>
反引号,逗号和逗号不仅适用于宏。如果你也使用eval,它们也可以在函数中使用。同样,这不是快速或有效的。无论如何,这是:
(defun bar (x &rest args)
(eval `(foo ,x 100 ,@args)))