|
|
||
7つの言語 7つの世界 の第5章 Scala の宿題をやってみました。私が Scala に触るのはこれが初めてです。
id:passingloop は MacPorts から Homebrew にのりかえました
% brew install scala
2.9.1 がイストールされました。
Scala の API ドキュメント
Scala Standard Library API (Scaladoc) 2.10.1
Java と Scala の比較
他の言語との比較もできる http://wota.jp/ac/?date=20100426#p01
var と val を比較した説明
いろいろありますが 関数型Scala(4):クロージャ - Mario Gleichmann - Digital Romanticism がおすすめです。
X,O,および空白文字で埋まった三目並べボードを見て,勝者,引き分け,勝者 未定のいずれかの判定を下すゲームを書け.必要ならクラスを使うこと.
M.Hiroi’s Home Page / Puzzle De Programming の解法を参考にしてみました。元の C 言語プログラミングをそのまま Scala で書いたので、Scala っぽいプログラムではなくなったのが残念です。例によって gist を貼り付けます。
盤面を
| 0 | 1 | 2 |
| 3 | 4 | 5 |
| 6 | 7 | 8 |
の一次元配列 List[Char] で表現しています。実行結果は、
% scala tictactoe.scala O
で O の勝ちです。
Scala ファイルの使い方の説明
Google 先生に聞いても、これといった日本語の説明が見つからなかったので、図書館にあった本(で貸し出しされていなかったもの)を 2 冊借りてきて探してみました。
.scala ファイルはスクリプトでもコンパイルしても使える。スクリプトとして使うのなら、
$ scala Foo.scala
で、コンパイルするなら、
$ scalac Foo.scala $ scala Foo
で実行できる。
クロージャはコードブロックとどこが違うのか
これは Google 先生に教えてもらったものを引用して答えとします。
クロージャのカッコいいところ、其の壱。クロージャはコードブロックである。かつ、使われる環境と結合できること。これが正式なクロージャの形であり、関数ポインタやら内部クラスやらその他もろもろのクロージャっぽいものと一線を画す機能です。
Martin Fowler’s Bliki in Japanese - クロージャ
2 日目のセルフスタディから var 禁止になりました (p.127)
foldLeft を用いて,文字列リストの合計長を計算せよ.
val words = List("lions", "tigers", "bears") println(words.foldLeft(0)((sum, word) => sum + word.length))
実行結果は、
% scala total_length.scala
16
不敬語である Shoot と Darn を Pucky と Beans で置き換えるメソッドを持つ Censor トレイトを書け.マップを用いて不敬語とその代替語のペアを格納すること.
文書 document を List[String] で表現するとして、
getOrElse を使ってシンプルに書けました。
不敬語とその代替語をファイルから読み込むようにしてみよ.
各行がスペース区切りで不敬語と代替語のペアになっているファイルを dictionary.txt という名前で用意して、
この dictionary.txt ファイルを censor するときに読みこむことにします。
関数 dictionary の戻り型 List[String,String] を指定しないとエラーになりました。Scala が型推論できなかったようです。Scala 静的型付けなので、推論できない型は指定する必要があるようです。
ページサイズ計算プログラムで,リンク先ごとに新しいアクターを作成しなかった場合,アプリケーションのパフォーマンスはどうなるだろうか.
ページサイズ計算アプリケーションに,ページ内のリンク数を数えるメッセージ を追加してみよ.
2 つまとめてやってみました。本文で紹介されている code/scala/sizer.scala へのパッチを gist で貼り付けます。
実行してみると、
% scala sizer.scala Sequential run: Size for http://www.amazon.com/: (103007,168) Size for http://www.twitter.com/: (46019,20) Size for http://www.google.com/: (11689,19) Size for http://www.cnn.com/: (86324,194) Method took 4.871293 seconds. Concurrent run Size for http://www.google.com/: (11686,19) Size for http://www.amazon.com/: (105275,165) Size for http://www.twitter.com/: (46021,20) Size for http://www.cnn.com/: (86324,194) Method took 1.82726 seconds. Single actor run Size for http://www.amazon.com/: (103046,169) Size for http://www.twitter.com/: (46020,20) Size for http://www.google.com/: (11674,19) Size for http://www.cnn.com/: (86322,194) Method took 3.628382 seconds.
Sequential run より Single actor run のほうが早いという結果になりました。