取消引用拼接而没有取消引用拼接?

mwa*_*wal 2 common-lisp

是否可以在不使用反引号的情况下编写以下内容?

(defmacro while (test &rest body)
  `(do ()
       ((not ,test))
     ,@body))
Run Code Online (Sandbox Code Playgroud)

以为我会以此为实验来了解反引号的好处。

我得到的是:

(let* ((test '(> 10))
       (x 0)
       (body '((princ x) (incf x))))
  (list 'do nil (list (list 'not test))))
Run Code Online (Sandbox Code Playgroud)

成功生成:

(DO NIL ((NOT (> 10))))
Run Code Online (Sandbox Code Playgroud)

为此,我需要一种n将列表中的元素散布body到生成的表单中的方法。我知道这是取消引用拼接的全部目的,,@但是如果没有它,这实际上是不可能的吗?很好奇...它类似于做什么apply 但是我现在显然不想调用函数。

cor*_*ump 5

在您的情况下,正文包含要评估的其余表格,可以添加以下内容LIST*

(let* ((test '(> 10))
       (x 0)
       (body '((princ x) (incf x))))
  (list* 'do
         nil   
         (list (list 'not test))
         body))
Run Code Online (Sandbox Code Playgroud)

另一个示例,其中拼接列表不位于末尾:

`(,x ,@y ,z)
Run Code Online (Sandbox Code Playgroud)

上面的代码可以不带反引号:

(list* x (append y (list z)))
Run Code Online (Sandbox Code Playgroud)