久々にScalaを試してみる。

久々にScalaを試している。以前少し使ったことはあるが、ゼロからの学習に等しい。そのメモを残しておこう。

(1) Scala開発環境の準備

Scalaは、公式サイト( http://www.scala-lang.org/download/ )から最新版(2013/09時点では2.10.2)をダウンロードしてアーカイブを解凍する。解凍したものは、C:\scala に配置した。環境変数を設定する。
SCALA_HOME に C:\scala を設定しておく。
・ PATH に %SCALA_HOME%/bin を追加する。なお、Scalaをインストールすると勝手にPATHに追加されているようだ。
なお、JavaJDKは事前にインストールしておく。また、テキストエディタとしてはサクラエディタを推奨するとの情報をいただいたので、事前にインストールしておいた。sinst2-1-0-0.exe をダウンロードして実行しておいた。合わせて、Eclipsescalaを利用したいので Eclipse 3.7(Indigo)を準備しておいた。typesafe社が提供するScala IDE for Eclipseではなく、Java用のEclipseである。実際には、日本語対応されたPreiades All in One JavaEclipse 3.7 をダウンロードしてインストールした。play2のフレームワークも入れてみた。以下の構成になる。


C:\java\jdk1.7.0 // JDK
C:\scala\ // Scala 2.10
C:\pleiades\eclipse-scala // Eclipse 3.7 (※scala用ではない)
C:\pleiades\eclipse-scala\workspace
C:\pleiades\eclipse-scala\workspace\hello // 誰もがscalaで最初につくるHelloWorldプロジェクト
C:\pleiades\play-2.1.3 // Play2フレームワーク
C:\pleiades\play-2.1.3\myPlayApp // 誰もがplay2で最初につくるアプリ

(2) Scalaの動作確認

Scalaの動作を確認してみる。cmdからscalaのバージョンを確認し、scalaのコンソールを起動してみる。


> scala -version
Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL

> scala
Welcome to Scala version 2.10.2 (Java HotSpot(TM) Client VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 1
res0: Int = 1

scala> 1 + 1
res1: Int = 2

scala> var a = 1
a: Int = 1

scala> a + 1
res2: Int = 2

scala> 'hello
res3: Symbol = 'hello

scala> "hello"
res4: String = hello

scala> res4
res5: String = hello

scala> res4 + res3 + res2
res6: String = hello'hello2

scala> :quit

read-eval-printのループが機能している。REPLと呼ぶそうだ。評価結果はres+行番号の変数にバインドされているようだ。Symbolをconcatinateするとシングルquoteがくっつくのか。Lispとはちょっと違うな。:quitまたはexitでコンソールを抜けられる。単にquitやbyeはダメみたい。もう少し確認してみよう。

scala> // 単にenterなら空行のみ。

scala> println("hello") // 履歴にはバインドされない。
hello

scala> print("hello") //
hello
scala> print("hello"); print(' '); print("world")
hello world
scala> print("hello"); print(' '); print("world"); 1
hello worldres5: Int = 1

scala> true // Trueはエラー
res6: Boolean = true

scala> null // nul,nil,Nullはエラー
res7: Null = null

scala> Unit // unitはエラー
res8: Unit.type = object scala.Unit

scala> ' ' // ''はエラー
res9: Char =

scala> 'a'
res10: Char = a

scala> 'a
res11: Symbol = 'a

scala> () // 履歴にはバインドされない。

scala> (1) // リストにはならない。1と等しい
res13: Int = 1

scala> (1, 2) // これはリストになる
res14: (Int, Int) = (1,2)

scala>

値を返さない(返値がUnit)のS式と()の結果が同じだ。Unit=()と言える。そもそも、LispでS式と呼んでいたものはScalaでは何と呼べばいいのだろう。返値がUnit(つまり値として()を持つ唯一のオブジェクト)である場合、REPLは改行のみを行うようだ。print("hello")の実行、()の実行結果から分かる。また何も入力しない/white-spaceのみの入力の場合も、read部が受け付けていないというより、print部が改行のみを行うと理解した方がいいのだろうか。

(3) Eclipseの設定

Eclipseは、Preiades All in One Javaの日本語Eclipse 3.7(pleiades-java-3.7.2.exe)をダウンロードしてインストールした。C:\pleiades\eclipse-scala に配置した。typesafeが提供するscala用のEclipseではないが、個人環境でJava用とScala用で区別したいので、新たなEclipseを「eclipse-scala」というディレクトリ名でインストールした。メニューなども既に日本語対応なので、新たに日本語プラグインを入れる必要はない。
なお、typesafeが提供するScala IDE for Eclipseは利用しないことにした。日本語対応していないようだし、さらに重いとの情報もある。Scala IDE for Eclipsehttp://scala-ide.org/download/sdk.html からダウンロードできるし、scala 2.10.xに対応したIDEである。
Eclipseを起動した後、scala 2.10 IDE for Eclipseをインストールする必要がある。「ヘルプ --> 新規ソフトウェアのインストール」を選び、「追加」で「http://download.scala-ide.org/sdk/e37/scala210/stable/site」のURLを指定し、適当に「scala 2.10 IDE」などとタイトルをつけて登録する。インストールするコンテンツが5つリストされる。最小でも「Scala IDE for Eclipse」は選択すること。ソースを含めてすべてを選択してもいい。Wizardを進めると、以下のものがインストールされたと表示された。InSynth Features, Play2, IDE for Eclipse, Search, Worksheet, ScalaTest for Scala IDEだ。Eclipse を再起動して有効となる。
hello worldを試してみる。「ファイル --> 新規 --> プロジェクト」で「scalaウィザード --> scalaプロジェクト」を選択できるようになっている。プロジェクト名に「hello」と入れてみる。サンプルをもとにMainという名前のscalaオブジェクトを新規に作成し、


object Main {
def main(args: Array[String]) = {
println("hello")
}
}
保存して「Main.scala」ファイルを選択して「実行 --> scala アプリケーション」で実行してみる。プロジェクトはデフォルトでUTF-8になっている。うまくいく。

おまけ(日本語コーディング)

Scalaは日本語コーディングに適しているとも聞いたので、ちょっと確認してみた。変数名まで日本語にしてみる。


object Main {
def main(引数: Array[String]) = {
println("こんにちは")
}
}
うまくいく。今度は「Main.scala --> メイン.scala」にリファクタリングしてみた。「object Main --> object メイン」も修正してみる。

object メイン {
def main(引数: Array[String]) = {
println("こんにちは")
}
}
確かにこれでもうまくいく。日本語で、属性名、引数名、メゾッド名、クラス名、ファイル名を表現しても大丈夫そうだ。さすがに環境依存文字はやめた方がいいだろう。Scalaに限ったことではなく、Unicodeが扱えるJavaでは行えたことではあるが、型推論やgetter/setterの省略などができるScalaでは、より日本語コーディングに近づけるということだろう。

実は、日本語コーディングは、Lispの時代(1987年ころ)に結構やった覚えがある。26年前か。確か、JARGONと呼んでいたスクリプト言語だった。エキスパートシステムを構築するための言語で、InterLispで書かれていた。自然言語でルールを記述したいというニーズから開発された言語だった。「もし…ならば…」をやたらと記述していたな。ClassとInstance(確かFactと呼んでいた)の概念があり、属性をSlotと呼んでいた。Characteristicと呼ばれる論理属性を特化させたものもあった。Classからこれらの属性や関数を継承してInstanceを生成できた。最低限のオブジェクト指向であったはずだ。まだCLOSは登場していなかったし、オブジェクト指向という言葉があったのかどうかも定かではない。SmalltalkPrologの影響は受けていたはずだ。当時のコードは残っていないが、Scalaで日本語コーディングしたものが、非常に当時のJARGONを思い出させてくれた。