如何在公共Lisp中解释逗号?

如何在公共Lisp中解释逗号?,lisp,common-lisp,Lisp,Common Lisp,编辑:在我的示例中,=>表示“计算为”,而->表示“扩展到宏扩展-1下” 我正试图用Common Lisp来理解嵌套的后引号,我想我已经非常接近理解它了,这要感谢其他几个SO问题(请不要让我参考它们——我已经看到了它们)。还有最后一件事困扰着我。考虑: `(a `(b ,,@(list 'c 'd))) => (a `(b ,c ,d)) 按照CLHS中向后扩展引用表单的算法,我逐步完成了上面第一个表单的(读取时间)扩展过程,事实上,对从该扩展中获得的表单进行评估确实会得到相同的结果。

编辑:在我的示例中,
=>
表示“计算为”,而
->
表示“扩展到
宏扩展-1
下”

我正试图用Common Lisp来理解嵌套的后引号,我想我已经非常接近理解它了,这要感谢其他几个SO问题(请不要让我参考它们——我已经看到了它们)。还有最后一件事困扰着我。考虑:

`(a `(b ,,@(list 'c 'd)))

=> (a `(b ,c ,d))
按照CLHS中向后扩展引用表单的算法,我逐步完成了上面第一个表单的(读取时间)扩展过程,事实上,对从该扩展中获得的表单进行评估确实会得到相同的结果。现在,在Peter Seibel的优秀著作《< /P> >中,只考虑<代码>的定义。
(defmacro once-only ((&rest names) &body body)
  (let ((gensyms (loop for n in names collect (gensym))))
    `(let (,@(loop for g in gensyms collect `(,g (gensym))))
      `(let (,,@(loop for g in gensyms for n in names collect ``(,,g ,,n)))
        ,(let (,@(loop for n in names for g in gensyms collect `(,n ,g)))
           ,@body)))))
根据该定义,SBCL显示以下宏扩展:

(once-only (from to)
  `(do ((,var ,from (next-prime (+ 1 ,var))))
       ((>= ,var ,to))
     ,@body)))

-> (LET ((#:G939 (GENSYM)) (#:G940 (GENSYM)))
     `(LET ((,#:G939 ,FROM) (,#:G940 ,TO))
       ,(LET ((FROM #:G939) (TO #:G940))
         `(DO ((,VAR ,FROM (NEXT-PRIME (+ ,1 ,VAR)))) ((>= ,VAR ,TO)) ,@BODY))))
现在,我的问题是扩展表单的第二行。难道不是:

`(LET (,(,#:G939 ,FROM) ,(,#:G940 ,TO))
?


请参见上面第一个示例中对
,@
的求值如何将逗号“分配”到从列表中拼接的元素
(cd)
?为什么这里不发生这种情况?这两个示例似乎具有相同的结构,但它们的评估结果似乎不一致。

我想我看到了我的错误。上面宏展开的第二行实际上应该是:

`(LET (,`(,#:G939 ,FROM) ,`(,#:G940 ,TO))
这相当于SBCL显示的内容