Powered by SmartDoc

プログラミング言語Onion 0.1α2

水島宏太

Onionとは

Onionは、オブジェクト指向プログラミング言語です。言語の機能的には、 Javaをベースにしながら、手軽なプログラミングを支援するいくつかの 機能を備えています。

オブジェクト指向
最近のプログラミング言語では、オブジェクト指向であることが当たり前のようになっています。Onionも、最近の言語らしく、オブジェクト指向です。Onionのオブジェクト指向はJavaをベースにしたクラスベースの静的型オブジェクト指向システムであり、クラス継承、インタフェース継承を持っています。
委譲
Javaなどの単一継承の言語では、しばしば、擬似的な多重継承を実現するために、メンバ変数に対して、メソッド呼び出しを全て委譲する単純委譲と呼ばれるテクニックが使われます。Onionでは、この単純委譲を言語としてサポートしているため、委譲コードを手動で書く手間を省くことができます。
代入による暗黙の型宣言
一時的にしか使われないローカル変数の型を宣言するのは、面倒なものです。Onionでは、代入を行ったときにそのローカル変数が宣言されていなければ、代入される値の型の変数を自動的に宣言します。これによって、ローカル変数の型宣言をかなり減らすことができます。もちろん、従来通り、型を宣言することも可能です。
自動キャスト
Javaなどの言語では、変数の型をスーパークラスからサブクラスにキャストする際に、明示的なキャストを必要とします。このことは、プログラムの安全でない箇所が、明示的にわかるという点で優れていますが、Java 5以前のような、Generics Typeの無い言語では、大量のキャストが必要となるため、プログラミング時の負荷が増大するというデメリットがあります。Onionでは、値の代入時にキャストが可能である場合、明示的なキャストを行わなくても、自動でキャストを行うため、キャストの量を大幅に減らすことができます。
クロージャ
Onionは、クロージャをサポートしています。Onionのクロージャは、クロージャを持つ他の多くの言語と違い、独立したデータ型ではなく、指定したインタフェースの実装クラスのインスタンスとして定義されます。この特徴のため、既存のライブラリで、インタフェース型を引数に取るメソッドに対して、クロージャをそのまま渡したりすることができます。
例外処理
Onionでは、もちろん、例外処理もサポートしています。Onionの例外処理は、ほぼ、Javaの例外処理機能と同じように扱うことができます。

言語仕様

クラス定義

  class class-name [extends super-class-name] [conforms interface-names ...] {
    member-declaration ...
    private | protected | public :
    member-declaration ...
	  ...
  }

クラスを定義します。

インタフェース定義

  interface interface-name [conforms interface-name ...] {
    interface-method-declaration ...
  }

インタフェースを定義します。

演算子式

  expression1 + expression2
  expression1 - expression2
  expression1 * expression2
  expression1 / expression2
  expression1 % expression2

expression1expression2を評価した後、 その結果に対して、算術演算を行います。各演算子の意味は、 Java言語の演算子と基本的に同じです。

  expression1 < expression2
  expression1 > expression2
  expression1 <= expression2
  expression1 >= expression2

expression1expression2を評価した後、 その結果に対して、比較演算を行います。各演算子の意味は、 Java言語の演算子と基本的に同じです。

  expression1 == expression2
  expression1 != expression2

expression1expression2を評価し、 その結果に対して、等値演算を行います。等値演算は、基本型 同士の場合、Java言語の場合と同じですが、参照型同士の場合、 expression1の結果のオブジェクトに対して、expression2 を引数としてequalsメソッドを呼び出した結果になります。

  expression1 === expression2
  expression1 !== expression2

expression1expression2を評価し、その結果に対して、 参照等値演算を行います。参照等値演算は、Java言語の等値演算と同じです。

is式

  expression is type-name

expressionを評価し、その結果のオブジェクトのクラスが、 type-nameで表される型のサブタイプである場合、真を返します。 Java言語のinstanceof演算子と同じ効果を持ちます。

キャスト

  expression $ type-name

expressionを評価し、その結果をtype-nameの型に 変換します。Java言語のキャスト演算子とほぼ同じです。

クロージャ式

  `type-name.method-name[argument-declarations] {
    statement ...
  }

type-nameで表されるインタフェース型を継承し、method-nameの メソッドを実装したクロージャオブジェクトを生成して、返します。ブロック文 の中からは、外側のスコープのローカル変数を参照することができます。

メソッド呼び出し式

  expression.method-name(parameter-list)

expressionparameter-listの式を評価し、expression の評価結果のオブジェクトに対して、method-name(parameter-list) の型にマッチするメソッドを呼び出し、その結果を返します。

制御構文

if文

  if condition {
    statement ...
  }
  [else { statement ...  }]

conditionが真のとき、ブロック文を実行します。conditionが 偽の場合、else節のブロック文を実行します。

cond文

  cond {
    expression { statement ... } ...
    [else { statement ... }]
  }

expressionの列を順番に評価して行き、最初に真になった式に 対応するブロック文を実行します。どのexpressionも真にならなかった 場合、else節のブロック文を実行します。

select文

  select target-expression {
    case expression { statement ... } ...
    [else { statement ... }]
  }

まず、target-expressionを評価してから、expressionの列を 順番に評価して行き、target-expressionと等しい値のexpression に対応するブロック文を実行します。どのexpressionとも等しくならなかった 場合、else節のブロック文を実行します。

while文

  while condition {
    statement ...
  }

conditionが真である間、ブロック文を実行します。

for文

  for initializer [condition] ; update {
    statement ...
  }

最初にinitializerを実行した後、conditionが真である間、 ブロック文、updateを順番に実行します。initializer には、式文、変数宣言、空文のいずれかを書くことができます。

ブロック文

  { statement ... }

{}で囲まれた文の列を、順番に実行します。

空文

  ;

何もしない文です。for文の初期化子で、何もしない場合などに使用します。

式文

  expression ;

expressionの式を評価して、結果の値を捨てます。

throw文

  throw expression ;

expressionを評価し、その結果得られたオブジェクトを throwします。expressionの型は、java.lang.Throwableの サブクラスでなければなりません。

チュートリアル

Hello, world

まずは、定番のHello, worldプログラムを作ってみます。次のプログラムを エディタで打ち込んで、HelloWorld.onという名前で保存してください。

  System::out.println("Hello, world!");
次に、onioncコマンドを使用して、このファイルをコンパイルします。 次のコマンドを、コンソールに入力してください。
> onionc HelloWolrd.on
コンパイルが成功すると、カレントディレクトリに、HelloWorldMain.class というクラスファイルが生成されるはずです。このファイルを、javaコマンド で実行します。次のようにコマンドを入力してください。
> java HelloWorldMain
成功すると、コンソールに
Hello, world!
と表示されるはずです。