Peter Seibel の本「Practical Common Lisp」から Lisp を学ぼうとしています。第8 章「マクロ: 独自のマクロを定義する」で、この 1 回限りのマクロに出くわしました。そのページの下部に、実装が示されています。
先ほど同じ目的で自作のマクロを実装してみましたが、一度だけの 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))))