Unquote Splic без UnQote Splic? - PullRequest
       7

Unquote Splic без UnQote Splic?

2 голосов
/ 28 мая 2019

Можно ли написать следующее без обратной кавычки?

(defmacro while (test &rest body)
  `(do ()
       ((not ,test))
     ,@body))

Думаю, я попробую это как эксперимент, чтобы понять пользу обратной цитаты.

Я дошел до этого:

(let* ((test '(> 10))
       (x 0)
       (body '((princ x) (incf x))))
  (list 'do nil (list (list 'not test))))

, который успешно генерирует:

(DO NIL ((NOT (> 10))))

Чтобы закончить, мне нужен способ распространения n элементов списка body в сгенерированную форму. Я знаю, что в этом вся цель склейки unquote ,@, но разве это невозможно без нее? Любопытно ... Это похоже на то, что apply делает , но я не хочу вызывать функцию в этот момент, очевидно.

1 Ответ

5 голосов
/ 28 мая 2019

В вашем случае тело содержит остальные формы для оценки и может быть добавлено с помощью LIST*:

(let* ((test '(> 10))
       (x 0)
       (body '((princ x) (incf x))))
  (list* 'do
         nil   
         (list (list 'not test))
         body))

Другой пример, где список склеенных не находится в конце:

`(,x ,@y ,z)

Выше можно написать без обратных кавычек как:

(list* x (append y (list z)))
...