Quick introductionの邦訳です。
Quick introduction
機能の一覧を見ただけではプログラム言語の本質に到達することはできません。言語を形作るものは、ごく細かいもが全体としてどのように関連するかということです。そして、これは実際にコードを書いてみないと評価できないものです。このセクションでは Ceylon について興味を持ち、試す気になってもらえるような分量の簡単な紹介をします。なので、これは包括的な機能リストではありません。
ありふれた読みやすい構文
Ceylon の構文は C言語に由来します。そのため、あなたが C や Java, C# プログラマならすぐに馴染み深く感じられるでしょう。まさにこれは Ceylon の目標の一つで、Ceylon の構文を学んだことがない非Ceylonプログラマがすぐにコードを読めるようにするためです。
単純な関数は以下のようになります。
function distance(Point from, Point to) { return ((from.x-to.x)**2 + (from.y-to.y)**2)**0.5; }
単純なClassは以下のようになります。
shared class Counter(Integer initialValue=0) { variable value count := initialValue; shared Integer currentValue { return count; } shared void increment() { count++; } }
そして、シーケンスの生成と繰り返しは以下のようになります。
String[] names = { "Tom", "Dick", "Harry" }; for (name in names) { print("Hello, " name "!"); }
もしこれらのコード例を退屈に感じたなら、それは良いことです。なぜならあなたはこれらをすぐに理解したから退屈に感じるからです。
木構造のための宣言的構文
階層構造はコンピューティングの世界では一般的で、階層構造を扱う XML のような専用の言語があるぐらいです。しかし階層構造を扱う手続き的なコードが欲しい時、XML とプログラミング言語とのインピーダンスミスマッチにより様々な問題に直面します。Ceylon は、階層構造を定義する特別な宣言的構文を組込で持っています。これは、特にユーザインターフェースの作成時に役立ちます
Table table { title="Squares"; rows=5; Border border { padding=2; weight=1; } Column { heading="x"; width=10; String content(Integer row) { return row.string; } }, Column { heading="x**2"; width=10; String content(Integer row) { return (row**2).string; } } }
この構文はユーザインターフェースだけでなく、より一般的な用途にも適合します。スクリプトの構築やテストスイートまで全てを表す重要な基盤となるのです。
Suite tests { Test { name = "sqrt() function"; void run() { assert(sqrt(1)==1); assert(sqrt(4)==2); assert(sort(9)==3); } }, Test { name = "sqr() function"; void run() { assert(sqr(1)==1); assert(sqr(2)==4); assert(sqr(3)==9); } } }
Java と XML を結びつけるどんなフレームワークでも、型チェックとオーサリングを行うことを目的としたツールが必要になります。Ceylon フレームワークは 構造木表現のための組込サポートを自由に使うことができ、ここで示したものの他にも、より多くの用途で利用することができます。
主型、結合型(union types)、交差型(intersection types)
Ceylon は強力な型システムを持ちますが、構文は従来と同じような見た目になっています。これは他の静的型システムでは簡単に表現できないものとなります。Ceylon の全ての型は、原則として、型システム自身の範囲で表現されます。プリミティブ型、配列型、それに類する型は存在しません。
型システムは、最適または主要(principal)型の分析に基づいています。表現ごとに、一意に最適な型が決定され、その後に現れる残りの表現を分析すること無しに決定されます。全ての型はコンパイラにより内部的に扱われ表示可能で、型は言語自身の内部で表現できるということになります。これが実際に何を意味するかというと、複雑なジェネリック型を扱う場合でも、コンパイラは常に人間の理解できるかたちでエラーを報告するということになります。Ceylon コンパイラは、JavaのList
表示可能な主型を扱う型システムに不可欠な部分が、結合型(union types)と交差型(intersection types)のためのファーストクラスです。結合型(union types)は、(|で連結)型リストのどれか一つのインスタンス受け入れる型です。
Person|Organization personOrOrganization = ... ;
交差型(intersection types)は(&で連結)型リストの全てを含んだインスタンスを受け入れる型です。
Printable&Sized&Persistent printableSizedPersistent = ... ;
結合型(union types)と交差型(intersection types)は、通常のコードでも便宜的に有用になる場合があります。より重要なのは、これらの型が、他の言語では複雑で不思議なもの(特にジェネリック型引数推論)が Ceylon では簡単に直接的に表現出来る点です。例えば以下を見てください。
value stuff = { "hello", "world", 1.0, -1 }; value joinedStuff = join({"hello", "world"}, {1.0, 2.0}, {});
コンパイラは自動的に型推論します。
- Sequence
for stuff, and - Empty|Sequence
for joinedStuff.
これらは正当な主型(principal types)表現です。特別な型指定は一切必要ありませんでした。
私達は型システムを根本から単純(quite simple at its core)に保つために苦労を重ねてきました。これは言語の学習を容易にし、バグの発生や直感的に反する一般的でない使い方をコントロールします。そしてまた、高度な規則化された型システムはジェネリックコードを書きやすくします。
blog1.mammb.com
に続く..