在 clojure 中,我可以像这样解构地图:
(let [{:keys [key1 key2]} {:key1 1 :key2 2}]
...)
这类似于 CoffeeScript 的方法:
{key1, key2} = {key1: 1, key2: 2}
CoffeeScript 也可以这样做:
a = 1
b = 2
obj = {a, b} // just like writing {a: a, b: b}
Clojure中有这样的快捷方式吗?
在 clojure 中,我可以像这样解构地图:
(let [{:keys [key1 key2]} {:key1 1 :key2 2}]
...)
这类似于 CoffeeScript 的方法:
{key1, key2} = {key1: 1, key2: 2}
CoffeeScript 也可以这样做:
a = 1
b = 2
obj = {a, b} // just like writing {a: a, b: b}
Clojure中有这样的快捷方式吗?
它没有提供,但可以用一个相当简单的宏来实现:
(defmacro rmap [& ks]
`(let [keys# (quote ~ks)
键#(映射关键字键#)
vals# (list ~@ks)]
(zipmap 键# vals#)))
用户=>(定义 x 1)
#'用户/x
用户=> (def y 2)
#'用户/y
用户=>(定义 z 3)
#'用户/z
用户=> (rmap xyz)
{:z 3,:y 2,:x 1}
我为此写了一个简单的宏,它可以让你把它写成(keyed [a b]). 或者,您可以将地图解构的 :strs 和 :syms 行为与(keyed :strs [a b])扩展为{"a" a, "b" b}.
最简洁的答案是不。
主要原因是在 Clojure 中,不仅关键字,任何值都可以用作映射中的键。此外,逗号是 Clojure 中的空格。So与将生成具有一个键值对的映射{a, b}相同,其中键是求值结果。{a b}a
但是,您可以编写一个宏,它采用符号列表并构建一个映射,其中符号的名称(转换为关键字)作为键,符号的评估作为值。
我不认为 clojure 中提供了开箱即用的功能。但是,嘿,这是 lisp,我们可以使用宏来拥有这样的东西:
(defmacro my-map [& s]
(let [e (flatten (map (fn [i] [(keyword (str i)) i]) s))]
`(apply hash-map [~@e]))
)
用法:
(def a 10)
(def b 11)
(def result (my-map a b))
结果将是你的地图