Scalaは、JVMで動作するオブジェクト指向関数型言語らしいですよ。詳しい話はよくわかりませんが、なんとなく心の片隅にひっかかっていたので、ちょっと触ってみることにしました。
まずはインストールです。Macなので、Mac portsをつかえば簡単にできます。Emacs向けにscala-modeも用意されているので、ついでにインストールすれば準備は万端になります。
% port install scala % sudo install -m 644 /opt/local/share/scala/misc/scala-tool-support/emacs/*.el /Applications/Emacs.app/Contents/Resources/site-lisp/
とりあえず、初心者向けのドキュメントがあるっぽいので、そちらを淡々と写経していきましょう。JavaプログラマのためのScalaチュートリアルとあるので、私にはぴったりです。
A Scala Tutorial for Java Programmers
1 Introduction
ドキュメントの前書きですね。このドキュメントの目的は、Scalaの概観を既にオブジェクト指向言語、とくにJavaの知識がある人に向けて解説するためにあるということがかかれていました。
2 A first example
まずはHello Worldからですね。
object HelloWorld {
def main(args : Array[String]) {
println("Hello, World")
}
}
mainはJavaと似ています。
本文によると、
- コマンドライン引数はargsに格納されている。
- mainメソッドは返り値を宣言しない手続きメソッドである。
- object HelloWorldという宣言はHelloWorldクラスとそのインスタンスをつくる。また、それはシングルトンオブジェクトとなる。
- staticはScalaに存在しない。シングルトンオブジェクトをつかう。
- printlnのレシーバは何か。
2.1 Compiling the example
コンパイルは scalac コマンドをつかうようです。scalacで先ほどのコード(2.scalaファイル)をコンパイルすると、2つのクラスファイルができあがりました。
$ scalac 2.scala
$ ls
2.scala HelloWorld$.class HelloWorld.class
$ javap HelloWorld
Compiled from "2.scala"
public final class HelloWorld extends java.lang.Object{
public static final int $tag();
public static final void main(java.lang.String[]);
}
% javap HelloWorld\$
Compiled from "2.scala"
public final class HelloWorld$ extends java.lang.Object implements scala.ScalaObject{
public static final HelloWorld$ MODULE$;
public static {};
public HelloWorld$();
public void main(java.lang.String[]);
public int $tag();
}
この時点で、もう色々と疑問は尽きませんが、ここは大人になって黙っておきます。
2.2 Running the example
それでは、実行してみましょう。特別に用意されたscalaコマンドで実行できるようです。
$ scala -classpath . HelloWorld Hello, World
Javaコマンドから実行できるでしょうか。
$ java -classpath . HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at HelloWorld.main(2.scala)
ScalaObjectがないとおこられてしまいます。そこで、Scalaのライブラリをクラスパスに追加して実行してみます。
$ java -classpath .:/opt/local/share/java/scala-library.jar HelloWorld Hello, World
おお、動作しましたね。

コメントする