Macros 曾经只有lisp宏,现在又是另一个实现

Macros 曾经只有lisp宏,现在又是另一个实现,macros,lisp,common-lisp,practical-common-lisp,Macros,Lisp,Common Lisp,Practical Common Lisp,我正试图从彼得·塞贝尔的书《实用的通用Lisp》中学习Lisp。在年,我遇到了这个唯一的宏。在该页的底部,给出了一个实现 早些时候,我尝试实现我自己的宏来实现相同的目的,但正如在中指出的那样,它有一个bug 这一次我做了另一个替代实现,希望能修复这个bug。我想知道这次我的实现是否正确 (defmacro my-once-only ((&rest args) &rest body) (let ((gensyms (loop for x in args collect

我正试图从彼得·塞贝尔的书《实用的通用Lisp》中学习Lisp。在年,我遇到了这个唯一的宏。在该页的底部,给出了一个实现

早些时候,我尝试实现我自己的宏来实现相同的目的,但正如在中指出的那样,它有一个bug

这一次我做了另一个替代实现,希望能修复这个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))))

如果代码(显然)正常工作,那么这对我们来说会更好。我已经为迁移做了标记。好的,tnx。我不知道代码审查,我错了,对不起。不用担心;这是一个更新的网站。因为这个问题没有具体的技术问题,所以它并不是关于堆栈溢出的主题,但它非常适合于代码审查。我宁愿看到它保持开放和迁移,而不是完全关闭。