Scala

February 16, 2008

[Scala]その4 数値はオブジェクト

チュートリアルを進めます。
A Scala Tutorial for Java programers
ScalaではJavaのintのようなプリミティブ型は存在しません。
整数型も実数型も全てがオブジェクトです。
また、+, *といった演算子は、実はメソッド呼出しに対応しています。
まずは単純な例からです。
1 + 2

上の例は、次のように書き換えることができます。
1.+(2)

これは、オブジェクト1のメソッド+を、引数に2を渡して呼び出していることになります。
Scalaでは引数が1つの場合は、メソッド呼出しの.()を省略できるため、
1.+(2)
1 + 2

は等価な式になります。
同様に
1 + 2 * 3 / x
1.+(2.*(3./(x)))
と表すことができます。

matssaku at 03:32|PermalinkComments(0)TrackBack(0)clip!

January 29, 2008

[Scala]その3 Javaのクラスを使う:続き Javaのジェネリクス

2008年1月現在の最新安定版2.6.1-finalではJava5.0以降で加わったジェネリクス機能は利用できないようです。
# Scalaの独自クラスでは利用できるようですが。
ただ、次期バージョン2.7ではこの制限が緩和され、Javaのクラスでもジェネリクスが利用できるようになるようです。
例えば
val array = new java.util.ArrayList[Int]
のような記述が可能になるようです。
Changes in Version 2.7 (to be released)

matssaku at 00:38|PermalinkComments(0)TrackBack(0)clip!

[Scala]その3 Javaのクラスを使う

チュートリアルを進めます。
A Scala Tutorial for Java programers
ScalaはJavaVM上で動作するため、Javaのクラスを自由に使うことができます。
早速プログラムを見てみましょう。

import java.util.{Date, Locale}
import java.text.DateFormat._

object JapaneseDate {
  def main(args: Array[String]){
    val now = new Date
    val df = getDateInstance(LONG, Locale.JAPANESE)
    println(df format now)
  }
}

現在の日付オブジェクトを取得し、日本のフォーマットで表示するプログラムです。
日付オブジェクトの作成に
java.util.Dateクラス
フォーマットに
java.text.DateFormat.getDateInstanceメソッド
をそれぞれ利用しています。
これらは、Javaに良く似たimport文を用いてimportしています。
import java.util.{Date, Locale}
java.utilパッケージのDateクラス、Localeクラスをimportしています。
java.text.DateFormat._
java.text.DateFormatクラスの全てのメンバをimportしています。
Javaのように*を用いないのは、Scalaでは*をメソッド名や変数名に用いることができるからです。
val now = new Date
はJavaの
Date now = new Date()
とほぼ同じ意味です。
Scalaではメソッド呼出しの際、引数が無い場合は括弧を省略することができます。
また、変数nowの型は型推論により自動的に決定されるため、これも記述する必要はありません。
あえて省略せずに記述した場合以下のようになります。
val now: Date = new Date()

最後に、printlnの引数が見慣れない形をしています。
df format now
は以下の記述と同じ意味を持ちます。
df.format(now)
Scalaでは、
オブジェクト.メソッド名(引数)/*引数が一つ*/

オブジェクト メソッド名 引数
のように書くことができます。

matssaku at 00:23|PermalinkComments(0)TrackBack(0)clip!

January 23, 2008

[Scala]その2. HelloWorld詳細

最初のプログラムが実行できたらHelloWorld.scalaの中身を詳しく見てみます。
1 object HelloWorld{
2     def main(args: Array[String]){
3         println("Hello, world!")
4     }
5 }

2〜4行目、mainメソッドはおなじみの形ですね。
argsはコマンドライン引数で、コロンの後ろArray[String]はその型を表しています。
Array[String]はString型の配列を表します。
printlnは標準出力に文字列を出力するメソッドです。
ん、メソッド?ScalaでもJavaと同じようにメソッド呼び出しはオブジェクトに対して行うのですが、ここではprintlnメソッドの属するオブジェクトが省略されているようです。
で、Javaプログラマになじみが無いのが1行目、objectという宣言です。
これは、Singletonオブジェクトを宣言する方法です。
別な言い方をするとobject宣言によりHelloWorldクラスとHelloWorldクラスの唯一のインスタンスを同時に宣言しています。
HelloWorld”はクラスとそのインスタンス、両方の名前を表すことになります。
Javaプログラマの方はmainメソッドにstaticが付いていないことに注目しましょう。
Scalaではstatic変数やstaticメソッドは宣言できません。
代わりにSingletonオブジェクトのメンバとして宣言します。

ちなみに、Scalaではプログラム内で使用するクラスなどはJavaと同様にimportするかパッケージ名付きで指定する必要があるのですが、上記プログラムの
Array
String
println
はいきなり使えています。
これはScalaにもJavaのjava.langパッケージと同様、importの必要無しに使えるクラス(など)があるからです。
importの必要無しに使えるのはパッケージ
scala
scala.Predef
のメンバのようです。
Scala API Reference:scala
Scala API Reference:scala.Predef

matssaku at 01:26|PermalinkComments(0)TrackBack(0)clip!

[Scala]その1.インストールとHello, world!

昨日紹介したプログラミング言語Scalaを
A Scala Tutorial for Java programers
を参考に動かしていきたいと思います。
インストールには前提ソフトウェアとしてJava1.4以降が必要です。
Javaの用意ができたら以下のページからScalaパッケージをダウンロードします。
http://www.scala-lang.org/downloads/index.html
Unixの場合ダウンロードしたパッケージを適当な場所に解凍し、
scala-x.x.x-final/bin/
にPATHを通します。
また、環境変数SCALA_HOMEをパッケージの配置場所(scala-x.x.x-finalの場所)に設定する必要があるようです。

設定できたら、試しにインタラクティブシェルを起動してみましょう。
$ scala
Welcome to Scala version 2.6.1-final.
Type in expressions to have them evaluated.
Type :help for more information.

scala>

プロンプトが表示されます。ここにscalaプログラムを打ち込むと即座に結果が得られます。例えば、
scala> 1+3
res0: Int = 4

1+3という入力に対し、Int型の4が返ってきました。
インタラクティブシェルはUnixの場合Ctrl-dまたはexitを入力することで終了できます。
動作を確認したら、早速最初のプログラムを作成しましょう。
以下のプログラムをHelloWorld.scalaというファイル名で作成します。
object HelloWorld{
    def main(args: Array[String]){
        println("Hello, world!")
    }
}

実行する前にコンパイルが必要です。以下のコマンドでJavaのクラスファイルが作成できます。
$ scalac HelloWorld.scala

実行にはscalaコマンドを使います。
$ scala -classpath . HelloWorld
Hello, world!

クラスパスを追加することで、javaコマンドでも実行できます。
$ java -classpath .:scala-2.6.1-final/share/scala/lib/scala-library.jar HelloWorld
Hello, world!


matssaku at 00:10|PermalinkComments(0)TrackBack(0)clip!

January 21, 2008

[プログラミング言語]その名はScala

達人プログラマーに影響されて(本は未読ですが)、ここ2,3ヶ月いろいろな言語に手を出しています。単に勉強というだけではなく、実際に開発に使える言語、ということで求める条件としては、

1. 静的型
やはり型は必要だと思います。プログラムを読む、あるいはデバックする時の資料として重要です。資料としてはプログラム中に明示的に書かれている方が便利、ということで型推論は無くても良いかもしれません。

2. 関数が第一級オブジェクト
現在メインで使っている言語がPythonなので、どうしても欲しい機能です。これがあると、Javaのデザインパターンのような大がかりな仕組みを使わなくても、柔軟なプログラミングができます。

3. ライブラリが充実している
実際のソフトウェア開発で使いたいので、文字列や各種プロトコルなどはライブラリで簡単に扱えるようになっていて欲しいです。

といった感じです。
1,2で見ると、やはり関数型言語かな、という感じがしていましたが、HaskellやOCamlではちょっとライブラリに不安を感じました。今のところ使える分野が限られてしまいそうです。で、色々試して見た結果気に入ったのが
Scala
です。
・関数型言語とオブジェクト指向言語、両方の特長を持っている
・Java VM上で動作し、Javaのライブラリを利用できる
というのが大きな特長です。
ちなみに、発音は
・スカァラ(開発者Martin Odersky氏)
もしくは
・スケィラ(アメリカ英語)
みたいです。
参考 Google Tech talk:Martin Odersky氏の発表映像
チュートリアルとして、
A Scala Tutorial for Java programers(15ページ)
Scala By Example(149ページ)
などが用意されています。
一つ目に関しては、宮本隆志さんという方が日本語訳をして下さっています。
A Scala Tutorial for Java programers(日本語)
まだ有名では無いですが、Javaに近い、親しみ易い文法で、関数型の強力な機能も使えて、ライブラリの不安も少ないというこの言語、数年後には流行るんじゃないかなー。




matssaku at 23:47|PermalinkComments(0)TrackBack(0)clip!