7

在 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中有这样的快捷方式吗?

4

4 回答 4

10

它没有提供,但可以用一个相当简单的宏来实现:

(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}
于 2012-01-25T09:10:49.737 回答
2

我为此写了一个简单的宏,它可以让你把它写成(keyed [a b]). 或者,您可以将地图解构的 :strs 和 :syms 行为与(keyed :strs [a b])扩展为{"a" a, "b" b}.

于 2012-01-25T08:57:11.497 回答
1

最简洁的答案是不。

主要原因是在 Clojure 中,不仅关键字,任何值都可以用作映射中的键。此外,逗号是 Clojure 中的空格。So与将生成具有一个键值对的映射{a, b}相同,其中键是求值结果。{a b}a

但是,您可以编写一个宏,它采用符号列表并构建一个映射,其中符号的名称(转换为关键字)作为键,符号的评估作为值。

于 2012-01-25T08:56:19.020 回答
0

我不认为 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))

结果将是你的地图

于 2012-01-25T09:34:58.087 回答