ClojureでFizzBuzzを書いた
このシリーズの一覧はこちら
はじめに
またClojureをちょこちょこいじりはじめています。ということで、凄く初歩的ですがFizzBuzzからやり直しています。
個人的な感想ですが、Clojureはやはり習得が少々難しい気がするので、ステップアップで学べるような記事を今後書いたいけたらなぁとか思っていたりもします。
コード
解説
インデントについて
まず、インデントの付け方ってこんな感じでしょうか? 他のサンプルなどを見よう見まねなのであってるのかわかりません・・・
1-100までのリストを生成
(def one-to-onehandred (map inc (range 100)))
one-to-onehandred
という変数に1〜100までのリスト(というかシーケンスになるんだっけ?)に格納しています。(range 100)
は 0〜99のリストになるので、(map inc ...)
して +1
してあげています。
FizzBuzz文字列にマッピング
(def fizzbuzz-list (map (fn [x] (cond (= (mod x 15) 0) "FizzBuzz" (= (mod x 3) 0) "Fizz" (= (mod x 5) 0) "Buzz" :else (str x))) one-to-onehandred))
次に、先ほどのone-to-onehandred
をその値を見て、FizzBuzz文字列にマップしてゆくため、無名関数fnを使っています。cond
で場合分けしています。判定はおなじみの割ったあまりが0になる場合というものです。:else
で、どれにも当てはまらなかった場合を表現していて、単純に(str x)
にて文字列にしています。最後に結果のリスト(シーケンス)をfizzbuzz-list
という変数に格納します。
出力
(doseq [x fizzbuzz-list] (println x))
そして最後に出力ですが(println ...)という標準出力に出力するという副作用を伴う操作となるので、ここでは
(doseq ...)
を利用しています。このdo〜
は他にもdorun
とかdoall
とか色々あるのでそのうちまとめたいなと思います。
実行&結果
今回は、以下のようにスクリプトとして実行します。
$ clj fizzbuzz3.clj
結果は
1 2 Fizz 4 Buzz Fizz 7 (中略) Fizz 97 98 Fizz Buzz
のように普通のFizzBuzzの結果となります。