Подтвердить что ты не робот

Как подключиться к списку за пределами макроса в Common Lisp?

Скажем, у меня есть функция foo:

(defun foo (x y &rest args) ...)

И я позже хочу обернуть его с помощью функциональной панели:

(defun bar (x &rest args) (foo x 100 args))

Предположим, что панель была вызвана так: (bar 50 1 2 3)

С помощью этой настройки args представляет собой список в теле панели, который содержит конечные параметры, поэтому, когда я передаю его foo, вместо получения эквивалента (foo 50 100 1 2 3) я, конечно, получаю (foo 50 100 '(1 2 3)). Если бы это были макросы, я бы использовал `` (foo, x 100, @args) `внутри тела бара для объединения аргументов в вызов функции., @работает только внутри списка с обратным отсчетом.

Как я могу сделать такой же сокет в регулярной функции?

4b9b3361

Ответ 1

APPLY вызовет свой первый аргумент с последующими аргументами, а последним аргументом должен быть список. Итак:

(apply #'foo x 100 args)

Ответ 2

Этот метод медленный, но это может быть то, что вы ищете.

Обратные кавычки, запятые и запятые не только для макросов. Они также могут использоваться в функциях, если вы тоже используете eval. Опять же, это не быстро или эффективно. Во всяком случае, вот оно:

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