Ceylonと少しだけ戯れてみる(第1回)

前回のScalaかCeylonかってブログを書いたけど、とりあえず新しい物好きの自分としてはCeylonを試してみることにしました。Scalaはちょいちょいつまみ食いしてるので、ホントに新しい言語にチャレンジするということでCeylon。

第1回とタイトルにあるけど1回で終わるかもしれません。

とりあえず、サイトを眺めてるとEclipse用のプラグインが提供されていて、これを入れるとすぐに始められるということだったので早速インストールして実行してみました。

CeylonIDEを利用する場合、まずはCeylonプロジェクトを作成し、sourceディレクトリ配下にCeylonユニットを作成してプログラムを書くことになります。

HelloWorld的なプログラムを書いてもしょうがないので簡単に以下のようなサンプルを書いて実行してみることに。


doc "The first program of Ceylon"
void hoge() {
String defaultNumbers = "One,
Two,
Three";
// 引数チェック
value args = process.arguments;
if (args.size > 0) {
print("Your input numbers are " + args.string);
} else {
print("The default numbers are " defaultNumbers "");
}
}

まず、Javaと違うのはどこにもmainがないということです。Ceylonのドキュメントにもありますが、Ceylonにはstatic mainが存在しません。ドキュメントのコマンドラインからの実行方法にもあるように、Ceylonではコンパイルされると、moudlesというディレクトリにdefault.carというファイルが出来上がります。IDEを利用してもこの挙動は同じです。で、おそらくIDE内部でこのdefault.carのhoge関数がコールされているように見えます。

(触り始めたばかりでまだよくわかってないですが、「ceylon -run -hoge default」というコマンドと同等の処理が行われているのではないでしょうか。コマンドラインから実行したことがないので想像でしかないですが)

さてこのプログラムを引数なしで実行すると結果は以下のようになります。


The default numbers are One,
Two,
Three

最初のdocという定義はコメントです。docはアノテーションで、Ceylonではドキュメンテーションコメントをアノテーションで記述するようです。ドキュメンテーション用のアノテーションはこれ以外にもあるので興味のある方はCeylonのドキュメントを参照してください。もちろん「/* */」や「//」も利用できます。

process.argumentsでコマンドラインからの引数をargs変数に格納しています。

このプログラムで明らかにJavaと違うのはStringの扱い方です。defaultNumbersは3行にわたって定義しており、結果も同様に3行で出力され、Two、Threeの直前のスペースがトリムされています。Javaでこのような出力を行おうとすると、間に"\n"を入れる必要があります。しかしこの出力は2行目以降の最初の文字が、1行目の最初の文字と同じ位置から開始している必要がるようです。

ためにしTwoの直前にスペースを挿入(もしくは削除)してプログラムを実行すると、出力結果は全く異なります。結論を言うとスペースがトリムされません。

この改行ですが、defaultNumbers.normalizedとすると文字列を加工して1行で出力されます。

今度は実行時に引数(four five Six)を渡して実行してみてください。結果は以下のようになると思います。


Your input numbers are { four, five, Six }

今度は引数が1件以上なので最初のprint文が実行されています。

if-elseのprint文の違いは最初のprint実行時は文字列連結が行われ、後のprint実行時は文字列の書き換え(JavaだとEL式や、プレースホルダを想像してください)が行われるようです。

なので、後のprintでdefaultNumbersのあとに""(空文字列)を定義する必要があるようです。

簡単なプログラムの紹介程度に済ませるつもりが、長くなったので、ついでに言っておくと、Ceylonでは、どうやらJavaやCのような、以下のようなコードは書くことができないようです。


...
int val = 1;

上記のようなコードはCeylonではビルドエラーとなります。Integerとすれば問題ないのですが、Ceylonでは以下のように書くことができます。


value val = 1;

で、変数valをIntegerとして扱いたいときは、val.integer、String型で扱いたいときはval.stringとします。


value val = 1;
String valAsStr = val.string;
Integer valAsInt = val.integer;
print("" valAsStr " " valAsInt "");

print("Your input numbers are " + args.string);はまさにこれを利用して、引数で受け取った配列をString型として出力しています。

まだ手探りで使いながらなので、結構間違っている情報もあると思いますが、とりあえず今回はここまでということで。

次回以降はクラスやインターフェースを用いたサンプルを紹介できればと思います。(次回があればですが。)