【发布时间】:2017-12-01 15:49:52
【问题描述】:
我正在尝试编写一个将调用重定向到执行此操作的函数的宏。这是一种将所有已发布的函数收集到顶级 clj 文件中的方法。 https://martinfowler.com/bliki/PublishedInterface.html
我想复制文档字符串和参数列表,文档字符串可以正常工作,但参数列表不行。我错过了什么?
(defmacro idef
[fname]
(let [sym (symbol (str "clojure.core/" fname))
metas (meta (find-var sym))
arglists (:arglists metas)
doc (:doc metas)]
;;`(def ~(with-meta fname {:doc doc :arglists arglists}))
`(def ~(with-meta fname {:doc doc})
~sym)))
(idef inc)
如果我改用注释行,我会得到
CompilerException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentVector, compiling:(interface.clj:22:1)
这只是一个将命名空间硬编码为 clojure 核心的示例。
这个问题真的很相似,但是你看我复制 :doc 部分没有问题, :arglists 有什么特别之处
Help me write a Clojure macro which automatically adds metadata to a function definition
【问题讨论】:
标签: clojure