読者です 読者をやめる 読者になる 読者になる

Sphereとともに

scalaとかplayframeworkとか。技術ブログにしたいなと。環境は Windows7x64, mac です。たまに声優さん情報が混ざります。最近ちょっとClojure触りました。

Clojure その8 for

if やったら for かな

とりあえず 1〜9 を表示するものを書いてみましょう

ちなみにScalaだとこんな感じ

object Main{
  def main(args: Array[String]) = {
    for(i <- 1 to 10){
      print(i)
    } 
  }
}

勘でClojureを記述してみる

(defn -main []
  (for [i (range 1 10)] 
    (print i)))

結果

$ lein run
$

Oh...

Clojure の for は lazy-seq(遅延シーケンス)らしいので

この書き方はダメなんでしょうね

遅延シーケンスなので、この式が評価されたときに中身が評価されるのではなく、シーケンスの中身が評価された時に評価される。
forマクロ - t2ru's blog より引用

ということで

Clojure の正解はこちら

(defn -main []
  (doseq [x (for [i (range 1 10)] i)]
    (print x)))

Clojureの方を動かせるまでに相当苦労しました

Clojureの文法よくわかってないからね。。。

おいしいClojure入門 (Software Design plus)

おいしいClojure入門 (Software Design plus)