clojure - 如何在 clojure 中实习宏?

标签 clojure

我想为调试目的做这样的事情:

(intern 'clojure.core 'doc clojure.repl/doc)

但它不允许我因为编译器说 - 不能取宏的值。

还有另一种方法吗?

最佳答案

宏是存储在元数据映射中带有 :macro true 的 Var 中的函数。这样你就可以

  • 通过 deref 的 Var 获取宏函数本身:
    @#'doc
    
  • 使用 intern 通过将适当的元数据附加到名称符号来将函数安装为宏(请参阅 (doc intern) promise 以这种方式提供的任何元数据传输到 Var):
    (intern 'clojure.core
            (with-meta 'doc {:macro true})
            @#'clojure.repl/doc)
    

  • 也可以使用阅读器元数据,只需记住将其放在“引用内”:
    ;; attaches metadata to the symbol, which is what we want:
    ' ^:macro doc
    
    ;; attaches metadata to the list structure (quote doc):
    ^:macro 'doc
    
    ^:macro^{:macro true} 的简写。

    关于clojure - 如何在 clojure 中实习宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20831029/

    相关文章:

    clojure - 覆盖 Clojure 记录的 equals

    list - 在 Clojure 中递归添加到列表

    clojure - 我可以在Clojure记录中创建可变状态吗?

    syntax - 有没有什么程序可以添加Clojure的括号?

    clojure - 如何从 Clojure 异常中提取元数据?

    java - JVM 可以只信任一次运行的自签名证书吗?

    Clojure 示例 : I cannot comprehend what are the values of "%2" and "%1" in "(str %2 %1)"

    recursion - 学习递归读写

    vector - 替换 Clojure Vector 中的重复项

    clojure - 通过应用单变量函数将旧的惰性序列转换为新的惰性序列