7つの言語7つの世界 第5章 Scala セルフスタディやってみた

7つの言語 7つの世界 の第5章 Scala の宿題をやってみました。私が Scala に触るのはこれが初めてです。

インストール

id:passingloopMacPorts から Homebrew にのりかえました

% brew install scala

2.9.1 がイストールされました。

1日目

探してみよう

ScalaAPI ドキュメント

Scala Standard Library 2.12.8

JavaScala の比較

他の言語との比較もできる 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 のほうが早いという結果になりました。