Ceylon 0.1
JBoss Advent Calendar 2011の21日目のエントリです。Ceylonがリリースされたので遊んでみます。
Ceylonは"Say more, more clearly"を標語とするJava VM上で動作する静的型の言語です。動的スクリプト言語ではありません。Java VM上で動作する静的型の言語、という点ではScalaやXtendやKotlinと同じです。
Hello World
とりあえず ceylon-0.1/samples/helloworld/source/com/acme/helloworld/helloworld.ceylon に格納されているHello Worldから見てみましょう。
doc "The classic Hello World program" void hello(String name = "World") { print("Hello, " name "!"); } doc "The runnable method of the module." void run() { if (nonempty args = process.arguments) { for (arg in args) { hello(arg); } } else { hello(); } }
コードの短い説明
- doc "The classic Hello World program"
- docアノテーション
- void hello(String name = "World") {
- デフォルト値ありメソッド引数
- print("Hello, " name "!");
- Stringテンプレート。printメソッドの宣言はprint(Object)となっている。
- if (nonempty args = process.arguments) {
- nonemptyはSequenceを判定するオペレータ。要素を一つ以上持っているSequenceの場合true。
コンパイルと実行
$ ceylonc source/com/acme/helloworld/* $ ceylon com.acme.helloworld/1.0.0 Note: Ceylon repository 'http://modules.ceylon-lang.org' not yet available. Hello, World!
さて、いくつか気になる点が。
まずStringテンプレート、Stringリテラル内に挟まれている変数をリテラルと合成して一つのStringにする機能ですね。なぜ"Hello, ${name}!"というような変数置換構文を導入しなかったのかという部分についてはFAQの言語デザインに記述があります。
print()メソッドはどうなってるんだろうな、というところをちょっと追ってみます。
- ceylon-0.1/repo/ceylon/language/0.1/ceylon.language-0.1.src
- ceylon/language/print.ceylon
- ceylon/language/process.ceylon
- ceylon/language/process.java
と辿っていくとSystem.out.println()になりました。
nonemptyはオペレータということで予約語扱いですが、他に以下のものが予約語となっています。
import class interface object given value assign void function of extends satisfies adapts abstracts in out return break continue throw if else switch case for while try catch finally then this outer super is exists nonempty
コンパイルと実行ですが、Ceylon 0.1では今のところ単一ディレクトリのみでコンパイルと実行を行うことはできないように見えます。言語としてモジュールシステムが備わっており、モジュールを省略すると"default"モジュールとして扱われ、モジュールはディレクトリ構成で管理されるのでオプションであがいてもコンパイルしたらモジュールのディレクトリツリーができることになります。逆に面倒なので素直に最初からディレクトリを作ったほうが良さそうです。
というわけでCeylonを試すときはどこかにプロジェクトディレクトリを作り、sourceサブディレクトリを作ってそこにソースを置きましょう。コンパイルを行うと隣にmodulesディレクトリができます。
- ~/tmp/sample-project
- source
- foo.ceylon
- modules
- source
コンパイルと実行はこんな感じになります。
$ ceylonc source/* $ ceylon default
実行するときのceylonコマンドは第1パラメータにモジュール名(とバージョン)、第2パラメータは省略可能ですがトップレベルメソッド名、もしくはクラス名+メソッド名を指定します。デフォルトは"run"なので、トップレベルメソッドのrun()が呼ばれるという仕組みになっています。モジュール名とかバージョンとか定義したい場合はhelloworldを参考にmodule.ceylonを置いておけばよさそう。
とりあえずここまで。サイト上にドキュメントがある程度豊富にあるので、気長に読んでみよう。