我怎样才能在普通的lisp中重新实现反引号?

时间:2011-01-01 22:02:19

标签: macros common-lisp quote

我必须重新制作反引号(使用unquote和unquote-splicing)而不使用内置读取器宏`,@ 预期的行为是:

> (BACKQUOTE (A B (LIST ‘C ‘D) (COMA (LIST ‘E ‘F)
                               (COMA-AT (LIST ‘G ‘H)))
(A B (LIST ‘C ‘D) (E F) G H)

我尝试用宏来做,但结果不是预期的。

非常感谢!!!

可以做些什么的提示?

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

对于那些善于解决一个简单而不正确的解决方案的人,但它有效,同时试图理解保罗格雷厄姆代码:

(defmacro backquote (expr)
  (labels
      ((step (p n)
             (append p
                     (if (atom n) (list n)
                       (case (car n)
                         ('comma (list (eval (cadr n))))
                         ('comma-at (eval (cadr n))))))))
    (list 'quote (reduce #'step (cons () expr)))))

欢迎提出改进建议的修正和建议!