如何在Common Lisp中拼接到宏外的列表?

时间:2010-04-13 05:52:48

标签: common-lisp

说我有一个函数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拼接到函数调用中。 ,@只能在引用引号列表中使用。

如何在常规函数中进行相同类型的拼接?

2 个答案:

答案 0 :(得分:32)

APPLY将使用其后续参数调用其第一个参数,并且最后一个参数必须是列表。所以:

(apply #'foo x 100 args)

答案 1 :(得分:0)

这种方法很慢,但它可能是您正在寻找的。

反引号,逗号和逗号不仅适用于宏。如果你也使用eval,它们也可以在函数中使用。同样,这不是快速或有效的。无论如何,这是:

(defun bar (x &rest args)
  (eval `(foo ,x 100 ,@args)))