Macros 如何在common lisp中重新实现反引号?
我必须在不使用内置读卡器宏`、@ 预期的行为是:Macros 如何在common lisp中重新实现反引号?,macros,common-lisp,quote,Macros,Common Lisp,Quote,我必须在不使用内置读卡器宏`、@ 预期的行为是: > (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代码的同时,很好地接受了一个简单且不正确的解决方案
> (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)))))
欢迎修改和建议,以改善它 嗯,我只是问,因为这个例子是一个完整的反报价,比我的“基本”家庭作业需要更多的功能,但无论如何,谢谢你,我会尝试去理解它