与えられた文字列の母音と子音の数を数える関数を作成しようとしています。戻り値は、vowels
とconsonants
の2つのキーを持つマップです。それぞれのキーの値は単なるカウントです。私がこれまでに開発することができましたClojure forループが更新された値の原子を返さない
機能は、しかし
(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}
のですか?
EDIT:str
からs
に変更されました。str
はClojureの関数です。
アトムを更新する要件はありますか? – jmargolisvt
@jmargolisvtいいえ、原子の具体的な要件はありません。私はClojureと状態を突き合わせる自然な方法だと思われましたが、私は選択肢を完全に開いています。 – idclark
あなたは既にあなたの質問への回答を得ていますが、ここではおそらく今実現していると思われる根本的な誤解を強調したいと思います - クローズには "for loop"はありません。 'for'はリストを作成するために使われる[list comprehension](https://en.wikipedia.org/wiki/List_comprehension)のコンストラクトです。そのため、ループしません('ループが適切に命名される)。ループの文脈で「for」という言葉を特徴とする命令的言語からの混乱を招くことがありますが、これはクロージャーの意味ではありません。 – Josh