在一個函數體,你應該let
定義局部變量,但這個代碼看起來很多像你這樣的嘗試將其彎曲成當務之急心態(def tempvar = new Map; foreach k,v in m do tempvar[k.toLower] = v; return tempvar)
。還要注意,的doseq
明確說明的文檔,它返回nil
。
功能的方法是在所述輸入直接返回結果的map
或reduce
。例如一個簡單的方法來map
(迭代的元素序列,解構鍵/值元組,發射修改的元組,再將它們成地圖):
user=> (into {} (map (fn [[k v]] [(.toLowerCase k) v]) {"A" 1 "B" 2}))
{"a" 1, "b" 2}
爲您的使用情況(修改地圖中的所有鍵)已經是一個很好的核心功能:reduce-kv
:
user=> (doc reduce-kv)
-------------------------
clojure.core/reduce-kv
([f init coll])
Reduces an associative collection. f should be a function of 3
arguments. Returns the result of applying f to init, the first key
and the first value in coll, then applying f to that result and the
2nd key and value, etc. If coll contains no entries, returns init
and f is not called. Note that reduce-kv is supported on vectors,
where the keys will be the ordinals.
user=> (reduce-kv (fn [m k v] (assoc m (.toLowerCase k) v)) {} {"A" 1 "B" 2})
{"a" 1, "b" 2}
你不應該使用'def'上的Clojure函數裏面。 'def'只能用在頂層。改用'let'來定義局部變量。 –