我一直在阅读Olin Shivers的文章《时尚Lisp编程技术》,发现那里的第二个示例(标为“ Technique n-1”)有点令人费解。它描述了一个自修改宏,如下所示:
(defun gen-counter macro (x)
(let ((ans (cadr x)))
(rplaca (cdr x)
(+ 1 ans))
ans))
它应该以其调用形式作为参数x
(即(gen-counter <some-number>)
)。这样做的目的是能够执行以下操作:
> ;this prints out the numbers from 0 to 9.
(do ((n 0 (gen-counter 1)))
((= n 10) t)
(princ n))
0.1.2.3.4.5.6.7.8.9.T
>
问题在于此macro
函数名称后面带有符号的语法在Common Lisp中无效。我一直没有尝试在Common Lisp中获得类似的行为。有人可以提供CL中类似宏的工作示例吗?
普通Lisp:
(defmacro gen-counter (&rest x)
(let ((ans (car x)))
(rplaca x (+ 1 ans))
ans))
但以上仅适用于解释器,不适用于编译器。
使用编译后的代码,宏调用消失了-它被扩展了-无需修改。
请注意的读者:您可能想非常仔细地阅读Olin Shivers的论文,并试图弄清楚他的实际含义...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句