【发布时间】:2016-12-03 05:47:36
【问题描述】:
我正在尝试编写一个函数来计算给定字符串中元音和辅音的数量。返回值是一个带有两个键的映射,vowels 和 consonants。每个相应键的值只是计数。
我目前能够开发的功能是
(defn count-vowels-consenants [s]
(let [m (atom {"vowels" 0 "consenants" 0})
v #{"a" "e" "i" "o" "u"}]
(for [xs s]
(if
(contains? v (str xs))
(swap! m update-in ["vowels"] inc)
(swap! m update-in ["consenants"] inc)
))
@m))
但是(count-vowels-consenants "sldkfjlskjwe") 返回{"vowels":0 "consenants": 0}
我做错了什么?
编辑:将我的输入从 str 更改为 s,因为 str 是 Clojure 中的一个函数。
【问题讨论】:
-
是否需要更新原子?
-
@jmargolisvt 不,对原子没有特定要求。在我看来,这似乎是使用 Clojure 改变状态的自然方式,但我对替代方案完全持开放态度。
-
虽然您已经收到了问题的答案,但我想强调一下您现在可能已经意识到的根本误解——clojure 中没有“for 循环”。
for是一个 list comprehension 构造,用于创建一个列表,因此它不会“循环”(正如您所见,loop的名称很恰当)。在循环上下文中使用单词for的命令式语言可能会让人感到困惑,但这不是 clojure 中的意思。
标签: clojure