"key1$value1,key2$value2" という形式の文字列を与えるマップを返す関数を clojure で書きたいと思います。私はこれを思いつきました。
(defn get-map
"Returns a map of key value pairs from a string formatted in the form 'key1$value1,key2$value2'"
[line]
(let [result {}]
(for [item (split line #",")]
(let [pair (split item #"\$")]
(assoc result (nth pair 0)
(if (= (.size pair) 2) (nth pair 1) ""))))))
これは機能しますが、このコードの唯一の問題は、リスト内のマップを返すことです。
=>(get-map "key1$value1,key2,value2")
({"key1" "value1"} {"key2" "value2"})
最初の let フォームの最後の式として結果を返そうとしましたが、結果は空のマップです。
(defn get-map
"Returns a map of key value pairs from a string formatted in the form 'key1$value1,key2$value2'"
[line]
(let [result {}]
(for [item (split line #",")]
(let [pair (split item #"\$")]
(assoc result (nth pair 0)
(if (= (.size pair) 2) (nth pair 1) ""))))
result))
=>(get-map "key1$value1,key2,value2")
{}
2つの質問 -
- リストラッパーなしでマップだけを返すように関数を変更するにはどうすればよいですか?
- 最初の let フォームの最後の式として結果を返すと、空のマップが返されるのはなぜですか?
また、同じ関数をより良い、より慣用的な clojure の方法で書くための提案があれば、それを歓迎します。