【问题标题】:how can i reimplement backquote in common lisp?如何在 common lisp 中重新实现反引号?
【发布时间】:2011-06-02 08:06:12
【问题描述】:

我必须在不使用内置阅读器宏 `,@ 预期的行为是:

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

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

非常感谢!!!

有什么可以做的提示吗?

【问题讨论】:

    标签: macros common-lisp quote


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 嗯,我只是问,因为这个例子是一个完整的反引号,其功能比我的“基本”作业需要更多,但无论如何,谢谢,我会试着理解它
      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 2015-04-30
      • 2011-11-24
      • 2020-08-16
      • 2020-12-18
      • 2023-03-23
      相关资源
      最近更新 更多