clojureの関数への引数のメタデータを一般的に取得する方法はありますか? この質問に投稿された回答は、実際には一般的に機能しません。
user> (defn foo "informative dox!" [] 1)
#'user/foo
user> (defmacro get-docs [func] `(:doc (meta (var ~func))))
#'user/get-docs
user> (get-docs foo)
"informative dox!"
user> (get-docs (identity foo))
; Evaluation aborted.
user> (defn process-docs [f] (let [docs (get-docs f)] (reverse docs)))
; Evaluation aborted.
var
リストで呼び出すことができないため、最後から 2 番目の行は機能しません(identity foo)
。また、最後の行は、コンパイラが解決できないと不平を言うため、コンパイルさえしませんf
。
私が見つけたこの問題の解決策のほとんどは、関数の定義内のシンボルまたはそのようなものにアクセスできるという考えに依存しているため、またはのようなことができ(resolve 'f)
ます(var f)
。しかし、その情報がわからない関数への引数で使用できるものが必要です。
基本的に、以下の疑問符の代わりに式を入れて、のメタデータを取得したいと思います#'map
。
(let [x map] (??? x))