言語の詳しい解説は、マニュアルや公式サイトなどをご覧ください。ここでは、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 = []; // SequenceVisualBasic や 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 は同位の存在であり、これらをまとめて「フィーチャー」と呼びます。(抽象クラスでは、その名も feature で表現します。)メソッドに引数が無い場合は、呼び出し時に括弧を付ける必要はありません。基底クラスの field を method でオーバーライドすることもできます。“関数”は存在しません。
コンストラクタの呼び出しは、C++ 言語系の“new ステートメント”ではなく、Delphi(ObjectPascal) などで見られる“Class.new”の方式が採用されています。コンストラクタに自由な名前を付けることができます。
// 画像をファイルから読み込んで Picture オブジェクトを生成
variable player_image = Picture.load("player.bmp");これは、クラスフィーチャーや定数の呼び出しと同じ書式です。
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;
endlist は、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