おっちょこちょい?な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