3

コンストラクトの逆のようなものが欲しい{:keys [...]}

(let [x 1 y 2 z 3] (create-map x y z))

...戻る必要があり{:x 1 :y 2 :z 3}ます。

つまり、各変数の名前をのように2回入力することは避けたいと思います{:x x :y y :z z}

この関数が必要な例:

(defn create-some-service-handle [user-id password api-key] 
    { :api-key api-key 
      :user-id user-id 
      :connection (obtain-connection user-id password) })
4

2 に答える 2

10

正確にある場所に立つことができるものを探している場合create-mapは、それらのシンボルを未評価にする必要があるため、マクロが必要になります。それは非常に単純なマクロになります:

(defmacro create-map
  [& syms]
  (zipmap (map keyword syms) syms))

これは単純に評価されていないシンボルを取り、mapskeywordダウンして一連のキーワードを取得し、次にzipmaps 元のシンボルを含むキー シーケンスを取得します。これはマクロであるため、この後、結果のフォームが評価され、キーワードから値 (シンボルが参照する値) へのマッピングが生成されます。

そのため、次のことを行う場合:

(let [x 1 y 2 z 3] (create-map x y z))

...返されます:

{:x 1 y 2 :z 3}

これはあなたが探しているものですか?

于 2012-07-29T00:25:42.340 に答える
3

修正点: 求めている解決策は機能しますが、「各変数の名前を 2 回入力するのを避けたい」理由が不明です。それが「個人的な好み」である場合、これはマクロ機能の乱用のように見えます。マクロを使用して得られる利便性は、 {:x 1 :y 2 :z 3} または (hash-map :xx : yx:zx)。コードの複雑さと引き換えに、利便性をほとんど購入していないようです。

マクロは、コードの保守性を低下させ (他の人は理解できない可能性があります)、シンボル キャプチャのような複雑さをもたらし (コードが単にハッシュ マップの作成以上のことを行う可能性があります)、higher- のように使用/受け渡しできません。関数を注文します(ラップしない限り)。

「Joy Of Clojure」(セクション 8.8) からの抜粋: 「マクロの習得に向けた道のりで学べる最も重要なスキルは、マクロの使用をいつ避けるべきかを認識する能力です。もちろん、一般的な答えは、いつでも、できるだけ頻繁に使用することです。あなたはできる。"

于 2012-07-30T20:41:48.013 に答える