我想在 clojure 中编写一个函数,它会返回一个地图,给出一个形式为“key1$value1,key2$value2”的字符串。我想出了这个。
(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")
{}
两个问题——
- 我应该如何修改函数以仅返回地图,而不使用列表包装器?
- 为什么将结果作为第一个 let 表单的最后一个表达式返回一个空映射?
此外,如果您有建议以更好、更惯用的 clojure 方式编写相同的函数,我们将不胜感激。