我已经学习了几周Clojure了。我知道数据结构和一些功能的基础知识。 (我正在阅读Clojure编程书)。
我坚持以下。我正在编写一个函数,它将减小所提供地图的键的大小写。
(defn lower-case-map [m]
(def lm {})
(doseq [k (keys m)]
(assoc lm (str/lower-case k) (m k))))
这就是我想要的,但我该如何归还地图? def
是否正确?
我知道这有效
(defn lower-case-map [m]
(assoc {} :a 1))
但上面的doseq
似乎造成了问题。
答案 0 :(得分:5)
在函数体中,您应该使用let
定义局部变量,但是这段代码看起来很像您尝试将其弯曲成命令式思维模式def tempvar = new Map; foreach k,v in m do tempvar[k.toLower] = v; return tempvar)
。另请注意,{docs}的文档{1}}显式声明,它返回doseq
。
功能方法是输入nil
或map
直接返回结果。例如。 reduce
的简单方法(迭代元素序列,解构键/值元组,发出修改过的元组,将它们转回映射):
map
对于您的用例(修改地图中的所有键)已经是一个很好的核心功能:user=> (into {} (map (fn [[k v]] [(.toLowerCase k) v]) {"A" 1 "B" 2}))
{"a" 1, "b" 2}
:
reduce-kv