キー、値の並びのリストをMapへ変換

Clojureでツールを作ってます。


Mapを引数に受け取る関数の記述を
キー、値の並びのリストを引数に書けるようにしたい。
("{}"を省略することで、DSLチックにしたい。)

;; 現在の関数呼び出し
(call-func {:param1 "value1" :param2 "value2"})
;; ↓
;; こんな感じで書けるようにしたい
(call-func :param1 "value1" :param2 "value2")

というわけでキー、値の並びをリストからMapに変換する関数を書いてみた。

(defn list->map [lst]
      (let [key-value-pairs (split-at (/ (count lst) 2) lst)]
	  (reduce #(assoc %1 (first %2) (last %2)) {} key-value-pairs)))

(defn call-func [& params]
      (call-func-map (list->map params)))

エラー処理とかしてないけど
今はこれで十分かな。


2010/10/18 追記。
Clojureにはpartitionという関数があることに気づいた。
partitionは指定した要素数で分割されたシーケンスを返してくれる。

user=> (partition 2 '(:key1 0 :key2 "aaa"))
((:key1 0) (:key2 "aaa"))
user=> (partition 3 '(:key1 0 :key2 "aaa" :key3 333))
((:key1 0 :key2) ("aaa" :key3 333))

こっちの方が便利。