Scalaおためし

ある程度複雑なソフトウェアを書くには型による支援はやっぱり欲しい。普段から Perl や JavaScript を書いている身としては、それなりに型の推論とかしてくれる書きやすいのがうれしい。goはたいへん簡潔な言語でコードもシンプルに保てそう、型のサポートも柔軟かつ十分で良い感じ。でも、ライブラリもこなれてきてそうで、ばりばり使われているScalaも気になる。

ということで最近はScalaの本を読んでた。コップ本は昔読んだけど、その後Scalaを使わなくてもう忘れてしまったので、O'Reillyの本で再入門した。

プログラミングScala

プログラミングScala

  • 作者: Dean Wampler,Alex Payne,株式会社オージス総研オブジェクトの広場編集部
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2011/01/20
  • メディア: 大型本
  • 購入: 3人 クリック: 320回
  • この商品を含むブログ (38件) を見る

前に入門したときも思ったけど、言語が多機能すぎると思う。特殊な機能はDSLを定義したりライブラリを作ったりしたときにしか使わないのだろうから、普段はあまり気にしなくても良いのかな。Perlにも特殊な言語機能がいろいろあるけど、使ってはいけない機能とかを把握していて、普段はそんなに気にせず書ける。

まずは、なにかしょぼくても動くものを書いてみようということで、これから10分以内に放送されるアニメをtweetするというスクリプトを書いた。@AnimeKansaiというアカウントでは、同様のPerlスクリプトをcronで10分ごとに呼び出して、放送状況をtweetしてる。そのスクリプトのScala版。

Scalaで書かれたHTTPクライアントであるDispatchというライブラリを使ってみている。OAuthクライアント機能もあって便利だ。ScalaらしくDSLでリクエストを定義できる。

url(
  "https://api.twitter.com/1.1/statuses/update.json"
).POST << Map("status" -> message) <@ (consumerKey, accessToken)

<<でリクエストのBodyをMapで設定できたり <@でOAuth認証用のヘッダが設定できたりしてやばい。初見で理解するのはむずかしい。メソッドをさがしてくるのも難しかった。

Http( syoboiRequest() OK as.xml.Elem )

のような呼び出しはHTTPリクエストを発行する。リクエストは非同期で行われる。返却値はFutureになっていて、foreachを呼び出してリクエスト完了時の処理を記述できる。

comingTitles() foreach( titles => titles foreach( title => {
  tweet(title)
}) )

見た目はとても逐次処理っぽいけど、非同期に動作する。comingTitles()が返したFutureが完了したら一番外側のforeachの中身がよばれる。titleの数だけtweetがリクエストを発行する。tweetはブロックせずに並列にリクエストがはしる。

日付の処理にはJoda TimeというJava向けの日付処理ライブラリを使ったりしてみてる。

Scalaの常識みたいな知識がないので、だいぶ書くのに苦労した。気楽なスクリプトでScala使う意味はあんまりないから、もうちょっと複雑なものを書いてみるか、Javaでしかできないようなこと(Androidアプリつくるとか)をやったら良さそう。