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

Common lisp 如何在Common Lisp中拼接到宏外部的列表中?,common-lisp,Common Lisp,假设我有一个函数foo: (defun foo(x y&rest参数) …) 然后我想用一个功能条来包装它: (解除锁定栏(x和rest参数) (foo x 100 args)) 假设bar被这样调用:(BAR501233) 在这个设置中,args是一个包含尾部参数的条体中的列表,因此当我将其传递给foo时,我没有得到与(foo 50 100 1 2 3)等效的参数,而是得到(foo 50 100'(1 2 3))。如果这些是宏,我会在bar的主体中使用“`(foo,x100,@args)`将a

假设我有一个函数foo:

(defun foo(x y&rest参数)
…)

然后我想用一个功能条来包装它:

(解除锁定栏(x和rest参数)
(foo x 100 args))

假设bar被这样调用:
(BAR501233)

在这个设置中,args是一个包含尾部参数的条体中的列表,因此当我将其传递给foo时,我没有得到与
(foo 50 100 1 2 3)
等效的参数,而是得到
(foo 50 100'(1 2 3))
。如果这些是宏,我会在bar的主体中使用“`(foo,x100,@args)`将args拼接到函数调用中但是,仅在倒勾引用列表中有效


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

APPLY将调用其第一个参数及其后续参数,最后一个参数必须是列表。因此:

(apply #'foo x 100 args)

这种方法速度很慢,但它可能正是您想要的

反引号、逗号和逗号AT不仅仅用于宏。如果您也使用eval,也可以在函数中使用它们。同样,这既不快速也不高效。无论如何,这就是:

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

如果您被迫使用eval,那么您没有使用更简单、更清晰的方法。你的方法是我脑海中第一个想到的,但我想要更好的。我的情况更复杂,但用append/concatenate'列表应用就可以了。+1:你救了我一天!或者,至少,你让我免于破解一个非常难看的解决方案。我今天遇到了这个问题,apply不起作用,因为我想应用的“函数”是and,实际上是一个宏!