nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Ceylon 0.1

JBoss Advent Calendar 2011の21日目のエントリです。Ceylonがリリースされたので遊んでみます。

Ceylonは"Say more, more clearly"を標語とするJava VM上で動作する静的型の言語です。動的スクリプト言語ではありません。Java VM上で動作する静的型の言語、という点ではScalaXtendKotlinと同じです。

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"
  • 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

コンパイルと実行はこんな感じになります。

$ ceylonc source/*
$ ceylon default

実行するときのceylonコマンドは第1パラメータにモジュール名(とバージョン)、第2パラメータは省略可能ですがトップレベメソッド名、もしくはクラス名+メソッド名を指定します。デフォルトは"run"なので、トップレベメソッドのrun()が呼ばれるという仕組みになっています。モジュール名とかバージョンとか定義したい場合はhelloworldを参考にmodule.ceylonを置いておけばよさそう。

とりあえずここまで。サイト上にドキュメントがある程度豊富にあるので、気長に読んでみよう。