Uva 言語の特徴

 言語の詳しい解説は、マニュアルや公式サイトなどをご覧ください。ここでは、Uva 言語の大きな特徴をいくつか挙げておきます。

名は体を示す

 言語のステートメント(キーワード)は、英単語で表現されています。

application class exception feature field method event constructor variable(var) constant ...

Perl などに慣れた人から見れば冗長かもしれませんが、これは、教育目的でもあるそうです。(ちなみに、juva を利用すると、これらのキーワードを日本語にすることもできます。)

複数の値を返すメソッド

x, y = a, b;
x, y = y, x; // swap
width, height = box.size;
set_bounds(x, y, box.size);

 メソッドは、複数の値を返すことができます。代入も一括して表現できます。メソッドの定義は、以下のようになります。

method size as Integer, Integer :
   return width, height;
end

変数の初期化と暗黙の型宣言

 変数の値は、宣言時に初期化できます。

variable iterator as ObjectListIterator = objects.iterator;

このような表記をしますが、Uva では、さらに一歩進んで、

variable iterator = objects.iterator;

という表記が可能です。このように記述した場合も、iterator は、ObjectListIterator 型です。

また、基本型では、以下のようになります。

variable count = 1;     // Integer
variable x = 1.0;       // Real
variable flag = false;  // Boolean
variable char = '';     // Character
variable text = "";     // String
variable sequence = []; // Sequence

field

 VisualBasic や C# のクラスには「プロパティ」があります。C++ や Java にはこれが無かったので、getValue(), setValue() メソッドで表現しました。Uva には、プロパティに似た機能を持つ field があります。

class Point :
for all :
    field x as Integer;

    field y as Integer;

end

変数と同じようにして、クラスに“プロパティ”を追加することができます。for all としたので、x と y は公開されますが、field 変数は、外部からは変更できません。これだけで、立派な読み取り専用プロパティになるのです。

System.display.println(point.x); // field にアクセス
for all :
    method set_x(new_value as Integer) :
        x = new_value;
    end

    method set_y(new_value as Integer) :
        y = new_value;
    end

もちろん、クラス内部からは値の変更が可能です。VisualBasic、C# のプロパティのように、外部から point.x = 10; と書くことはできません。

point.set_x(10);

field と method

 field と method は同位の存在であり、これらをまとめて「フィーチャー」と呼びます。(抽象クラスでは、その名も feature で表現します。)メソッドに引数が無い場合は、呼び出し時に括弧を付ける必要はありません。基底クラスの field を method でオーバーライドすることもできます。“関数”は存在しません。

コンストラクタの呼び出しとクラスフィーチャー

 コンストラクタの呼び出しは、C++ 言語系の“new ステートメント”ではなく、Delphi(ObjectPascal) などで見られる“Class.new”の方式が採用されています。コンストラクタに自由な名前を付けることができます。

// 画像をファイルから読み込んで Picture オブジェクトを生成
variable player_image = Picture.load("player.bmp");

これは、クラスフィーチャーや定数の呼び出しと同じ書式です。

for buddy

 Uva は、ユニットによる分割コンパイルを強く要求しています。その特徴のひとつに、「for buddy アクセス指定」があります。これは、“ユニット内のクラスだけに公開する”というもので、それぞれのクラスが親子関係である必要はありません。“共通で使いたいが、外部に公開するものではない。”という場合に使います。(import 先には公開されません。)

処理の委託

 あるクラスに、別のクラスのインスタンスを内包し、そのメソッドを選んで公開する場合があります。公開メソッドと内包されたメソッドの形(名前、引数および戻り値)が一致する場合は、forward to ステートメントで、この“処理の委託(委譲)”を簡潔に記述することができます。

/*
   Item の集合体
*/

class ItemList :
// 情報 //
for all :
   method count as Integer forward to list;

   method is_empty as Boolean forward to list;

for self :
   field list as StringHashMap;
  
end

list は、StringHashMap 型の内部フィールドです。ItemList は、独自のデータクラスのコレクションなので、list.add をそのまま公開するわけにはいきません。しかし、count など、公開しても問題のないフィーチャーもあります。この記述は、以下の省略形です。

method count as Integer :
   return list.count;
end

例外と異常

 例外 exception は、クラスとは区別して定義されています。Exception, Failure, Error, Terminator の基底例外(例外の分類)があり、必要であれば、これらの型を継承してユーザー定義の例外を宣言することもできます。

exception FileLoaderException inherits Exception;
method load(file_path as String) :
   // 読み込み処理

catch FileLoaderException :
   // 読み込みに失敗した場合の処理

finally :
   // 最後に必ず実行される処理

end

更新履歴

2002年1月4日

2002年4月6日

2002年5月22日


counter