我想做这样的事情用于调试目的:
(intern 'clojure.core 'doc clojure.repl/doc)
但它并没有让我,因为编译器说 - 不能接受宏的价值。
还有另一种方法吗?
答案 0 :(得分:10)
宏是存储在Var中的函数,其元数据映射中包含:macro true
。所以,你可以
通过deref
Var:
@#'doc
使用intern
通过将适当的元数据附加到名称符号来将函数安装为宏(请参阅(doc intern)
,它承诺将以这种方式提供的任何元数据传输到Var): / p>
(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}
的缩写。