我正在尝试从Peter Seibel的书" Practical Common Lisp"中学习Lisp。在chapter 8 : "Macros: Defining your own"中,我遇到了这个曾经只有一次的宏。在该页面的底部,给出了一个实现。
我之前为了同样的目的尝试实现自己的宏,但它有一个错误,正如once-only lisp macro, is my implementation correct?所指出的那样。
这次我做了另一个替代实现,希望能解决这个bug。我想知道这次我的实施是否正确?
(defmacro my-once-only ((&rest args) &rest body)
(let
((gensyms (loop for x in args collect (gensym))))
`(let
(,@(loop for g in gensyms for x in args collect `(,g ,x))
,@(loop for x in args collect `(,x (gensym))))
`(let
,`(,,@(loop for x in args for g in gensyms collect ``(,,x ,,g)))
,,@body))))