在 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))
结果将是你的地图