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

时间:2019-05-28 13:21:48

标签: common-lisp

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

(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的{​​{1}}元素散布到生成的表单中。 我知道这是unquote接头body的全部目的,但是没有它实际上是不可能的吗?很好奇……类似于,@ does,但是我现在显然不想调用一个函数。

1 个答案:

答案 0 :(得分:4)

在您的情况下,正文包含要评估的其余表格,可以与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)))