将此翻译为Common Lisp

Wojciech Gac

我一直在阅读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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章