是否可以在不使用反引号的情况下编写以下内容?
(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,但是我现在显然不想调用一个函数。
答案 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)))