一次性的lisp宏,又一个实现

时间:2014-11-04 13:59:22

标签: macros lisp common-lisp practical-common-lisp

我正在尝试从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))))

0 个答案:

没有答案