1

我必须在不使用内置阅读器宏的情况下重新制作反引号(使用取消引用和取消引用拼接)`,@ 预期的行为是:

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

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

非常感谢!!!

有什么可以做的提示吗?

4

2 回答 2

3

http://lib.store.yahoo.net/lib/paulgraham/glsbq.lisp有一个例子

于 2011-01-01T22:55:01.077 回答
0

对于那些很好地解决了一个简单且不正确的解决方案但它有效的人,同时试图理解 paul graham 代码:

(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)))))

欢迎指正和提出改进建议!

于 2011-01-06T22:15:09.863 回答