怎么可能在clojure中实习宏?

时间:2013-12-29 22:56:59

标签: clojure

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

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

但它并没有让我,因为编译器说 - 不能接受宏的价值。

还有另一种方法吗?

1 个答案:

答案 0 :(得分:10)

宏是存储在Var中的函数,其元数据映射中包含:macro true。所以,你可以

  1. 通过deref Var:

    获取宏函数
    @#'doc
    
  2. 使用intern通过将适当的元数据附加到名称符号来将函数安装为宏(请参阅(doc intern),它承诺将以这种方式提供的任何元数据传输到Var): / p>

    (intern 'clojure.core
            (with-meta 'doc {:macro true})
            @#'clojure.repl/doc)
    
  3. 也可以使用读者元数据,只需记住将其“置于引号内”:

    ;; 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}的缩写。