将变量列表转换为名称变量映射

Convert list of vars to a name-var map

我正在为 Clojure 使用 Yesql 库。它的 defqueries 宏 returns 代表 SQL 查询的 Var 列表。我想将该列表转换为查询名称到 Var 的映射,并提出了以下变体:

(def main-queries (defqueries "sql/main.sql"))
(def query-map
  (apply hash-map
         (reduce
           (fn [coll query]
             (conj coll (->> query meta :name keyword) query))
           [] main-queries)))

这么简单的任务,显得很不雅和繁琐。你能推荐一个更短更地道的版本吗?

谢谢!

您可以创建名称 -> var 映射,然后使用 into:

(def query-map
  (let [pairs (map (fn [v] [(->> v meta :name keyword) v]) main-queries)]
    (into {} pairs)))