それは可能ですが、あなたがそれを定義したように、あなたはかなり悲しいでしょう:clojure.coreのすべての関数を参照する何百ものエントリを持つマップは必要ありません!また、現在の名前空間だけを調べても、fx
値が関数であるシンボルであるを含めるのを忘れていました。さらに、マクロによって導入された、不要な字句記号がよくあります。たとえば、(let [[x y] foo])
foo、x、y、およびのような4つのシンボルが表示されますvec__auto__4863
。
とにかく、あなたはおそらくそれらの問題について妥協して生きなければならないでしょう、さもなければ(そして本当に私はこれがより良いと思います)あなたが実際にマップしたいシンボルを指定します。ただし、(a)字句または(b)現在の名前空間で定義され、(c)関数にマッピングされていない記号の値を自動的に取得するには、次を使用できます。
(defmacro return-all-symbols []
(let [globals (remove (comp :macro meta val) (ns-publics *ns*))
syms (mapcat keys [globals, &env])
entries (for [sym syms]
[`(quote ~sym) sym])]
`(into {}
(for [[sym# value#] [~@entries]
:when (not (fn? value#))]
[sym# value#]))))
(def a 1)
(defn fx [b]
((fn [c] (return-all-symbols)) (first b)))
(fx [:hello])
;=> {a 1, c :hello, b [:hello]}