Scalaは、
Scalaで開発されているプロダクトとして、
Scalaの実装は学内のProgramming Methods Laboratory(LAMP)を中心に行われています。配布ライセンスはBSDライクのScala Licenseです。実行にはJDK1.
Java VM上で動作するスクリプト言語としては、
本稿では短いプログラムを実行するまでの手順と、
基本的な使い方
ダウンロードとインストール
ダウンロードは、
ダウンロード用のモジュールは、
インストールはこれらを展開すれば完了です。必要があれば、
筆者のWindows環境でZIPをダウンロードし展開したところ、
コマンドラインシェルでのプログラム実行
Scalaのコマンドラインシェルはscalaコマンドで実行を開始します。終了するには:quitを入力します。コマンドラインシェルの実行から終了までの流れを図1に示します。ここではいわゆるHello Worldプログラムを実行していますが、
%SCALA_HOME%\bin> scala ← コマンドラインシェル開始 Welcome to Scala version 2.6.0-final. Type in expressions to have them evaluated. Type :help for more information. scala> object ScalaProgramming { ← ソースコード入力開始 | def main( args: Array[ String ] ) { | println( "Scalaによるプログラミング" ) | } | } defined module ScalaProgramming ← ソースコード入力終了 scala> ScalaProgramming.main( null ) ← プログラム実行 Scalaによるプログラミング ← 実行結果(メッセージ出力) scala> :quit ← コマンドラインシェル終了 %SCALA_HOME%\bin>
classファイルへのコンパイル
ScalaのソースコードをJavaのclassファイルにコンパイルするには、
> scalac ScalaProgramming.scala ← ソースコードをコンパイル > scala ScalaProgramming ← コンパイル済みのclassファイルを実行 Scalaによるプログラミング ← 実行結果
Eclipseプラグインのインストール
ScalaにはEclipseプラグインも用意されていますが、
筆者の環境ではインストール時に警告画面が表示されましたが、

Scalaプロジェクトの作成
プラグインのインストールが完了すると、



EclipseでのScalaアプリケーション開発
さっそくソースコードの入力、
パッケージの作成を終えたら、
完成したプログラムを実行した例を図7に示します。Scalaパースペクティブといっても、

Scalaプログラミングを少しだけ
では、
objectとclass
図1を見て、
では、
scala> object ScalaProgramming { ← ソースコード入力開始 | def main( args: Array[ String ] ) { | println( "Scalaによるプログラミング" ) | } | } defined module ScalaProgramming ← ソースコード入力完了 scala> ScalaProgramming.main( null ) ← プログラム実行 Scalaによるプログラミング ← 実行結果 scala> var o = new ScalaProgramming() ← インスタンスを変数oに代入? <console>:4: error: not found: type ScalaProgramming ← エラーが表示された! var o = new ScalaProgramming() ^ scala>
classで宣言している場合は、
scala> class ScalaProgramming { ← classとして宣言してみる | def main( args: Array[ String ] ) { | println( "Scalaによるプログラミング" ) | } | } defined class ScalaProgramming scala> var o1 = new ScalaProgramming() ← newでインスタンス生成 o1: ScalaProgramming = ScalaProgramming@168f248 scala> var o2 = new ScalaProgramming() ← 別のインスタンスも生成 o2: ScalaProgramming = ScalaProgramming@805298 scala> println( o1 == o2 ) false ← 2つは別のインスタンス scala> o1.main( null ) ← インスタンスでメソッド実行 Scalaによるプログラミング scala> o2.main( null ) Scalaによるプログラミング scala>
defはメソッド
defはメソッドを表しますが、
引数の型は引数の後に、
scala> def sum( n : Int ) = n * ( n + 1 ) / 2 ← 1からnまでの整数の総和を求めるメソッド sum: (Int)Int ← 戻り値の型は自動的にIntと判定された scala> sum( 10 ) res0: Int = 55 ← 1から10までの整数の総和は55 scala> def a = 5 ← 代入文も記述できる(メソッドの特殊形) a: Int ← 値がInt型であることを自動的に判定 scala> def b = 1000L ← 値の末尾にL(小文字でも良い)をつけてLong型に b: Long scala> def c = 3.2D ← 値の末尾にD(小文字でも良い)をつけてDouble型に c: Double scala> def d = 5.5f ← 値の末尾にf(大文字でも良い)をつけてFloat型に d: Float scala> def fact( n : BigInt ) : BigInt = if ( n == 0 ) 1 else ( n * fact( n - 1 ) ) ← 再帰処理も記述可能 fact: (BigInt)BigInt scala> fact( 100 ) ← 1から100までの階乗! res1: BigInt = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 scala> def resultFalse() = { true; false; } ← 戻り値がfalseになるメソッド resultFalse: ()Boolean scala> resultFalse() res2: Boolean = false ← 戻り値はfalse scala> def resultTrue() = { false; true; } ← 戻り値がtrueになるメソッド resultTrue: ()Boolean scala> resultTrue() res3: Boolean = true ← 戻り値はtrue scala>
toとuntil
範囲を表すtoとuntilでは、
scala> println( 1 to 5 ) Range(1, 2, 3, 4, 5) scala> println( 1 until 5 ) Range(1, 2, 3, 4) scala> println( 5 to 1 ) Range() scala> println( 5 until 1 ) Range() scala>
Rubyのブロックのような処理ができる
Scalaでは、
scala> (1 to 5).foreach( x => println( x ) ) ← 1から5までの値を表示 1 2 3 4 5 scala> (1 to 5).map( x => x * x ) ← 1から5までの値をそれぞれ2乗 res0: RandomAccessSeq.Projection[Int] = RangeM(1, 4, 9, 16, 25) scala> (1 to 5).filter( x => x > 3 ) ← 3より大きな要素のみを抽出 res1: Seq.Projection[Int] = RangeF(4, 5) scala> for( x <- 1 to 5 ) yield x * x ← yieldも使える res2: RandomAccessSeq.Projection[Int] = RangeM(1, 4, 9, 16, 25) scala> def sqr( n : Int ) = for( x <- 1 to n ) yield x * x dup: (Int)RandomAccessSeq.Projection[Int] scala> sqr( 5 ).foreach( s => println( s ) ) 1 4 9 16 25
> irb irb(main):001:0> (1..5).each { |x| puts x } 1 2 3 4 5 => 1..5 irb(main):002:0> (1..5).map { |x| x * x } => [1, 4, 9, 16, 25] irb(main):003:0> (1..5).find_all { |x| x > 3 } => [4, 5] irb(main):004:0> def sqr( n ) for x in 1..n; yield x * x; end end => nil irb(main):005:0> sqr( 5 ) { |s| puts s } 1 4 9 16 25 => 1..5 irb(main):006:0>
リストや配列ではないタプル
IPアドレスやデータベースのテーブルの1行分のデータのように、
タプルの要素は左から_1, _2, ...のように指定します。図14に例を示します。
scala> var p = (3.0, 4.0) p: (Double, Double) = (3.0,4.0) scala> var x = p._1 x: Double = 3.0 scala> var y = p._2 y: Double = 4.0 scala> Math.sqrt( x * x + y * y ) res0: Double = 5.0 scala>
"""~"""とXML
複数行にわたる長い文字列は"""~"""で記述できます。これはPythonと同じです。そしてXML自体をソースコードに記述できます。これはXQueryと同じです。ソースコード内にこうしたものが記述されているのはJavaプログラマにとっては驚きかもしれませんが、
図15に示すとおり、
scala> var html = """<html> | <head><title>Scalaでプログラミング</title></head> | <body><h1>その1 基本的なこと</h1></body> | </html>""" html: java.lang.String = <html> <head><title>Scalaでプログラミング</title></head> <body><h1>その1 基本的なこと</h1></body> </html> scala> var xml = <html> | <head><title>Scalaでプログラミング</title></head> | <body><h1>その1 基本的なこと</h1></body> | </html> xml: scala.xml.Elem = <html> <head><title>Scalaでプログラミング</title></head> <body><h1>その1 基本的なこと</h1></body> </html> scala> xml \ "head" res0: scala.xml.NodeSeq = <head><title>Scalaでプログラミング</title></head> scala> xml \ "body" res1: scala.xml.NodeSeq = <body><h1>その1 基本的なこと</h1></body> scala> xml \\ "title" res2: scala.xml.NodeSeq = <title>Scalaでプログラミング</title> scala> xml \\ "h1" res3: scala.xml.NodeSeq = <h1>その1 基本的なこと</h1> scala>
.や()をつけなくてもよい
Javaプログラミングでは、
scala> Math.sqrt( 5.0 ) ← Javaでは一般的な記述 res18: Double = 2.23606797749979 scala> Math sqrt 5.0 ← .や()を記述しなくても動作する res19: Double = 2.23606797749979 scala> 1 to 5 foreach x => println x ← 優先順位が不明確でうまく動作しない <console>:1: error: not a legal formal parameter 1 to 5 foreach x => println x ^ scala> (1 to 5).foreach( x => println( x ) ) ← ()で優先順位を示せば動作する 1 2 3 4 5 scala>
今回紹介できたのはScalaプログラミングのほんの入り口に過ぎません。その先にはJavaでは体験できない世界が遠くまで広がっています。サンプルソースなどを参照しながら、