Можно ли написать следующее без обратной кавычки?
(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
делает , но я не хочу вызывать функцию в этот момент, очевидно.