我必须在不使用内置阅读器宏的情况下重新制作反引号(使用取消引用和取消引用拼接)`,@ 预期的行为是:
> (BACKQUOTE (A B (LIST ‘C ‘D) (COMA (LIST ‘E ‘F)
(COMA-AT (LIST ‘G ‘H)))
(A B (LIST ‘C ‘D) (E F) G H)
我尝试用宏来做,但结果不是预期的。
非常感谢!!!
有什么可以做的提示吗?
我必须在不使用内置阅读器宏的情况下重新制作反引号(使用取消引用和取消引用拼接)`,@ 预期的行为是:
> (BACKQUOTE (A B (LIST ‘C ‘D) (COMA (LIST ‘E ‘F)
(COMA-AT (LIST ‘G ‘H)))
(A B (LIST ‘C ‘D) (E F) G H)
我尝试用宏来做,但结果不是预期的。
非常感谢!!!
有什么可以做的提示吗?
对于那些很好地解决了一个简单且不正确的解决方案但它有效的人,同时试图理解 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)))))
欢迎指正和提出改进建议!