我正在尝试从 Peter Seibel 的书“Practical Common Lisp”中学习 Lisp。在第 8 章:“宏:定义你自己的”中,我遇到了这个只有一次的宏。在该页面的底部,给出了一个实现。
我之前尝试为相同的目的实现自己的宏,但它有一个错误,正如在一次仅 lisp 宏中指出的那样,我的实现是否正确?.
这次我做了另一个替代实现,希望能修复这个错误。我想知道这次我的实现是否正确?
(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))))