宮本 隆志(みやもと たかし)
 SIer勤務。関数型プログラミング言語や形式手法に興味があり色々勉強中。"A Scala Tutorial for Java programmers"の和訳やScala勉強会(scala-beなど)での発表などScalaの普及活動を行っている。

 現在使用されているScala 2.7系に対して、2009年後半にβ版が公開されテスト中のScala 2.8系では大きな変更や数多くの興味深い機能追加が行われています。今回は、前回に続いてScala 2.8の新機能について紹介します。

 なおScala 2.8は現在も開発中です。この記事は2010/01/27にリリースされたBeta 1版のScala 2.8.0を元に執筆していますので、Scala 2.8の正式リリースまでに変更が加わる可能性があることを予めお断り致します。

Scala 2.8.0 Beta 1が公開

 前回の記事が公開された後、2010年1月27日に、Scala 2.8.0.Beta1-prereleaseが公開されました(詳しくはScala 2.8.0 Beta 1をご覧ください)。

 気になるのは2009/12/24版からの差分ですが、今回の各種コレクションに対するmapの例の出力が変わったりするなど、若干差異がありました(今回の原稿は2010年1月27日版に基づいて執筆しています)。

 前回の記事では、下記の3点が変更になります。

(1)インストール方法
 prerelease版になってIzPack Installerが用意され、インストールがより簡単になっています。(前回記事と同様に、zipファイルを入手してインストールするのでももちろんOKです。)

(2)トランポリンを用いた相互再帰
 前回記事の末尾再帰の項で述べたトランポリンを用いた相互再帰については、ライブラリの使い方が変わりました。Scala 2.8.0 Beta1では下記の様なサンプルコードで試してみてください。

scala> import scala.util.control.TailCalls._
import scala.util.control.TailCalls._

scala> object B {
     |   def even(n:Int):TailRec[Boolean] =
     |     if (n==0) done(true) else tailcall(odd(n-1))
     |   def odd(n:Int):TailRec[Boolean] =
     |     if (n==0) done(false) else tailcall(even(n-1))
     | }
defined module B

scala> B.even(2000000).result
res0: Boolean = true

(3)継続コンパイラプラグイン
 継続コンパイラプラグイン(Beta1ではまだ本体に統合されませんでした)に関しては、ビルド前提のjarファイルが増えているので、前回記事の方法ではビルドできません。Rich Dougherty's blogのScala 2.8.0 beta 1 releasedにビルド方法がまとめられていますのでそちらをご覧ください。

 Scala 2.8での大きな変更点の一つはコレクションライブラリの改訂です。改訂に際しては三つの目標「デザインの一貫性」「コードの再利用」「既存コードとの互換性」を掲げています。

 最初にデザインの一貫性とコードの再利用とについて、各種コレクションクラスにおけるmapメソッドの実装を通じて考察します。

 また、Javaライブラリを含む既存コードとの互換性については前回のpackage objectなどの仕組みを通じて差異を吸収しようとしていますが変更点もある為、最後に後方互換性についてまとめます。