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)
        keys# (マップ キーワード キー#)
        vals# (リスト ~@ks)]
    (zipmap キー # vals #)))
ユーザー=> (デフォルト x 1)   
#'ユーザー/x
ユーザー=> (デフォルト y 2)
#'ユーザー/y
ユーザー=> (定義 z 3)
#'user/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ではコンマは空白です。つまり{a, b}、と同じで{a b}あり、1つのキーと値のペアを持つマップになります。ここで、キーは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 に答える