从Clojure函数中返回一个映射

时间:2015-07-21 08:07:17

标签: clojure

我已经学习了几周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似乎造成了问题。

1 个答案:

答案 0 :(得分:5)

在函数体中,您应该使用let定义局部变量,但是这段代码看起来很像您尝试将其弯曲成命令式思维模式def tempvar = new Map; foreach k,v in m do tempvar[k.toLower] = v; return tempvar)。另请注意,{docs}的文档{1}}显式声明,它返回doseq

功能方法是输入nilmap直接返回结果。例如。 reduce的简单方法(迭代元素序列,解构键/值元组,发出修改过的元组,将它们转回映射):

map

对于您的用例(修改地图中的所有键)已经是一个很好的核心功能:user=> (into {} (map (fn [[k v]] [(.toLowerCase k) v]) {"A" 1 "B" 2})) {"a" 1, "b" 2}

reduce-kv