这是可能的,但正如你定义的那样,你会很伤心:你不想要一个包含数百个条目的映射,这些条目引用了 clojure.core 中的所有函数!即使您只查看当前命名空间,您也忘记了 include fx
,它是一个符号,其值是一个函数。另外,通常会有你不想要的词汇符号,由宏引入。例如,(let [[x y] foo])
将显示四个可用符号:foo、x、y 和类似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]}