おっちょこちょい?なScalaソースを添削してClojureに書き換えてみた
If you have to learn just one programming language - Babu Srinivasan's blog
を見ていたが、最後に出てきたScalaのソースがダメなJavaソースそっくりなことにがっかり。
はてブには「Scalaサンプルがひどい。for文の中を、moneyを引数にして新しいmoneyを返す関数に書き換え、その関数の結果を次の関数の引数に渡す〜みたいなスタイルにすればいいのに。」と書いたが、それをClojureで書くとこんな感じか。
;28 - 36行目 (defn game [bet money] (let [dice (inc (rand-int 100))] (cond (<= dice 50) (- money bet) (and (>= dice 66) (<= dice 75)) (+ money (* 0.5 bet)) (and (>= dice 76) (<= dice 99)) (+ money bet) (= dice 100) (+ money (* bet 2)) :else money))) ;22行目 (defn init-money [bet num-plays] (* bet num-plays)) ;27行目のfor文の代わり (defn play-stream [bet num-plays] (iterate #(game bet %) (init-money bet num-plays))) ;27行目のfor文をnum-plays分実行した結果 (defn play [bet num-plays] (nth (play-stream bet num-plays) num-plays)) ;結果の表示用文字列 (defn report [init result num-plays] (format "%6.0f$ became %6.0f$ after %6d plays: You get %.2f for a dollar" init result num-plays (/ result init)))
結果は
(let [bet 1.0 num-plays 100000 init (init-money bet num-plays) stream (play-stream bet num-plays)] (println (report init (play bet num-plays) num-plays))) 100000$ became 80953$ after 100000 plays: You get 0.81 for a dollar nil