【发布时间】:2014-04-22 23:33:09
【问题描述】:
我正在尝试从 Peter Seibel 的《实用通用 Lisp》一书中学习 Lisp。在chapter 8 : "Macros: Defining your own" 中,我遇到了这个只有一次的宏。在该页面的底部,给出了一个实现。现在这对我来说是一个非常复杂的宏,所以我看到了this question on stackoverflow,那里有一些很好的解释。
但是,即使我(仍然)还没有完全理解宏,我也理解了它的用途。所以我尝试编写自己的实现:
(defmacro my-once-only ((&rest names) &body body)
(let
(
(gensyms (loop for n in names collect (gensym)))
)
`(list 'let
(list ,@(loop for n in names for g in gensyms collect `(list ',g ,n)))
(let
,(loop for n in names for g in gensyms collect `(,n ',g))
,@body))))
(如果我没有遵循标准的 lisp 缩进约定,请原谅我,我试图以某种方式缩进代码,以便我可以理解去哪里,因为我是新手)
我测试这个宏的方式与我链接的那一章中描述的方式大致相同,即。使用 (random 100) 之类的参数调用函数,这样如果对它们进行两次评估,结果将是错误的。我还通过macroexpand/macroexpand-1 扩展了我的宏(以及我使用它的宏),这似乎也是正确的。
所以我想知道我的实现是否正确?还是我遗漏了什么(我可能认为)......
【问题讨论】:
标签: macros lisp common-lisp practical-common-lisp