地图重组

ben*_*tah 7 clojure destructuring coffeescript

在clojure中,我可以像这样构造一个地图:

(let [{:keys [key1 key2]} {:key1 1 :key2 2}]
  ...)
Run Code Online (Sandbox Code Playgroud)

这与CoffeeScript的方法类似:

{key1, key2} = {key1: 1, key2: 2}
Run Code Online (Sandbox Code Playgroud)

CoffeeScript也可以这样做:

a = 1
b = 2
obj = {a, b} // just like writing {a: a, b: b}
Run Code Online (Sandbox Code Playgroud)

在Clojure中有这样的捷径吗?

Ale*_*art 10

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

(defmacro rmap [& ks]            
 `(let [keys# (quote ~ks)
        keys# (map keyword keys#)
        vals# (list ~@ks)]
    (zipmap keys# vals#)))
user=> (def x 1)   
#'user/x
user=> (def y 2)
#'user/y
user=> (def z 3)
#'user/z
user=> (rmap x y z)
{:z 3, :y 2, :x 1}