7つの言語7つの世界 第5章 Scala セルフスタディやってみた
7つの言語 7つの世界 の第5章 Scala の宿題をやってみました。私が Scala に触るのはこれが初めてです。
1日目
探してみよう
他の言語との比較もできる http://wota.jp/ac/?date=20100426#p01
var と val を比較した説明
いろいろありますが 関数型Scala(4):クロージャ - Mario Gleichmann - Digital Romanticism がおすすめです。
試してみよう
X,O,および空白文字で埋まった三目並べボードを見て,勝者,引き分け,勝者 未定のいずれかの判定を下すゲームを書け.必要ならクラスを使うこと.
ホームページ移転のお知らせ - Yahoo!ジオシティーズ の解法を参考にしてみました。元の C 言語プログラミングをそのまま Scala で書いたので、Scala っぽいプログラムではなくなったのが残念です。例によって gist を貼り付けます。
盤面を
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
の一次元配列 List[Char] で表現しています。実行結果は、
% scala tictactoe.scala O
で O の勝ちです。
2日目
探してみよう
Scala ファイルの使い方の説明
Google 先生に聞いても、これといった日本語の説明が見つからなかったので、図書館にあった本(で貸し出しされていなかったもの)を 2 冊借りてきて探してみました。
.scala ファイルはスクリプトでもコンパイルしても使える。スクリプトとして使うのなら、
$ scala Foo.scala
で、コンパイルするなら、
$ scalac Foo.scala $ scala Foo
で実行できる。
クロージャはコードブロックとどこが違うのか
これは Google 先生に教えてもらったものを引用して答えとします。
クロージャのカッコいいところ、其の壱。クロージャはコードブロックである。かつ、使われる環境と結合できること。これが正式なクロージャの形であり、関数ポインタやら内部クラスやらその他もろもろのクロージャっぽいものと一線を画す機能です。
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?Closure
試してみよう
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 静的型付けなので、推論できない型は指定する必要があるようです。
3 日目
ページサイズ計算プログラムで,リンク先ごとに新しいアクターを作成しなかった場合,アプリケーションのパフォーマンスはどうなるだろうか.
ページサイズ計算アプリケーションに,ページ内のリンク数を数えるメッセージ を追加してみよ.
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 のほうが早いという結果になりました。