1

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))))
4

0 に答える 0