Ceylon : Quick introduction 邦訳(4)


Quick introductionの邦訳その4です。

blog1.mammb.com

演算子ポリモーフィズム

Ceylon は、CとJavaでサポートされる大部分の演算子に加え、リッチな演算子を一式備えています。演算子のオーバーロードはサポートされません。<+|:-) にて演算子を定義することもできませし、* を数字の掛け算以外の用途に再定義することもできません。しかしながら各演算子は、特定のクラスやインターフェース型の上で動作するよう言語により予め定義されており、拡張したり型を満たすどんなクラスにも適用することができます。我々は、このアプローチを演算子ポリモーフィズム(operator polymorphism)と呼んでいます。

例えば、Ceylon 言語のモジュールは Summable インターフェースを定義しています。

shared interface Summable<Other> of Other
        given Other satisfies Summable<Other> {
    shared formal Other plus(Other that);
}

そして + 演算子は Summable に割り当てられた値のために定義されています。例えば次のような例となります。

x+y

これは単に以下の省略形です。

x.plus(y)

同様に < は Comparable インターフェースに関して定義されており、* は Numeric に関して定義されています。その他についても同様です。


型安全なメタプログラミングとアノテーション

Ceylon は、型安全なメタモデルとイベントを含むメタプログラミングの洗練されたサポートを提供します。ジェネリックコードは反射的にメンバを呼び出し、メンバの呼び出しをインターセプトするかもしれません。この機構は Java におけるリフレクションより強力で型安全です。

Class<Person,Name> personClass = Person;
Person gavin = personClass(Name("Gavin", "King"));

Ceylon は現代的な構文でアノテーション要素のプログラムをサポートします。実際、アノテーションは abstract shared といった言語の修飾子のように使えます。ドキュメンテーションコンパイラが使う組込のAPIドキュメント用のアノテーションは以下のように使われます。これらは Ceylon のキーワードではありません。

doc "The user login action"
by "Gavin King"
throws (DatabaseException,
        "if database access fails")
see (LogoutAction.logout)
scope (session)
action { description="Log In"; url="/login"; }
shared deprecated
void login(Request request, Response response) {
    ...
}

すこし極端なサンプルですがね。

モジュラリティ

Ceylon は言語レベルでのパッケージとモジュール構成機能があります。ブロックローカル、パッケージプライベート、モジュールプライベート、公開可視などを表す共通のアノテーションを通してプログラム要素からのアクセス制限を言語レベルで提供します。Java の protected に相当するものはありません。モジュール間の依存関係はCeylonで書かれたモジュールデスクリプタにて指定します。

Module module {
    name='org.jboss.example';
    version='1.0.0';
 
    doc="This module is just a silly example. You'll
         find some proper modules in the community
         repository [Ceylon Herd][Herd].
 
         [Herd]: http://modules.ceylon-lang.org
 
         Happy Herding!";
 
    Import {
        name='ceylon.math';
        version='0.3.0';
    },
    Import {
        name='ceylon.file';
        version='0.3.1';
    }
}

Ceylon コンパイラはモジュールリポジトリの中に直接 .car モジュールアーカイブを作成します。展開された .class ファイルを見ることはありません。

実行時にモジュールはピアツーピア・クラスローダ・アーキテクチャによりロードされます。これはまさに JBoss AS 7 で使われたモジュールランタイムと同じ機構に基づくものです。

Ceylon Herd はオープンソースモジュールを共有するためのコミュニティモジュールリポジトリです。


ツアーに進みましょう

導入は終わりました。Ceylon のツアーに進み、より詳細な Ceylon チュートリアルのツアーに進んでください。