gpt4 book ai didi

clojure - :keys destructuring: construct map from sequence的逆过程

转载 作者:行者123 更新时间:2023-12-01 23:27:36 25 4
gpt4 key购买 nike

我用 Clojure 写的越多,我越遇到以下这种模式:

(defn mapkeys [foo bar baz]
{:foo foo, :bar bar, :baz baz})

在某种意义上,这看起来像是解构的逆过程

(let [{:keys [foo bar baz]}] ... )

会实现。

在 Clojure 中是否有一种“内置”方式来实现与上述 mapkeys(将名称映射到关键字=>值)类似的东西 - 可能是任意长度的名称列表?

最佳答案

没有内置这样的东西,因为它不需要。与相当复杂的解构不同,在 Clojure 中构建映射非常简单,因此普通库可以采用奇特的方式来实现。例如,我很久以前写过 flatland.useful.map/keyed ,它反射(reflect)了 map 解构的三种模式:

(let [transforms {:keys keyword
:strs str
:syms identity}]
(defmacro keyed
"Create a map in which, for each symbol S in vars, (keyword S) is a
key mapping to the value of S in the current scope. If passed an optional
:strs or :syms first argument, use strings or symbols as the keys instead."
([vars] `(keyed :keys ~vars))
([key-type vars]
(let [transform (comp (partial list `quote)
(transforms key-type))]
(into {} (map (juxt transform identity) vars))))))

但如果你只关心关键字,而不需要文档字符串,它可能会更短:

(defmacro keyed [names]
(into {}
(for [n names]
[(keyword n) n])))

关于clojure - :keys destructuring: construct map from sequence的逆过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66951309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com