Home About Rice Downloads Documents Others Cooker CookerGX
Documents  >  Development  >  ricemanager
Rice言語のフロントエンド。

RiceManagerクラス

Rice言語のフロントエンドとなる、RiceManagerクラスについて説明します。

なお、以下の説明では、実装言語としてC#を想定しています。

コンストラクタ

最初に、RiceManagerクラス(C#)のインスタンスを取得しなければなりません。RiceManagerクラスは幾つかのコンストラクタを持ちますが、通常は、Riceソースファイルへのパスを引数とするコンストラクタを使います。

例えば

RiceManager manager = new RiceManager("c:\.....\example.cook");


コンストラクタは、与えられたソースファイルを解析して、実行開始前の準備をします。実行開始前の準備とは、ユーザ定義クラス(Rice)のプロトタイプの作成と格納です。

ソースファイルがRice言語の文法として正しい場合は、コンストラクタがRiceManagerクラスのインスタンスを返します。ソースファイルに文法的な問題がある場合は、コンストラクタは、例外を送出して終了します。

Riceの送出する例外については、専用の章を設けて、そこで説明します。


プログラムではエラーが頻繁に発生します。したがって、コンストラクタは、try-catch文で囲われなければなりません。さもないと、Riceソースの間違いによって、アプリケーション自体が強制終了してしまいます。

プログラムの実行

RiceManagerクラスのインスタンスが、問題なく取得できれば、Riceプログラムを実行できます。

Riceプログラムは、mainクラス(Rice)のopenメソッドを呼び出すことで実行を開始します。


RiceManagerクラスには、mainクラスのopenメソッドを呼び出すためのメンバ関数が3つあります。


public void Run()

public Rtype Invoke(string methodname, Queue<Rtype> argqueue)

public Rtype Invoke(string methodname, Queue<Rtype> argqueue, bool argCheck)

public void Run()

RiceManagerクラスの"public void Run()"メンバ関数は、Riceのmainクラスの"start()"メソッドを呼び出します。

"start()"のシグネチャは、"open method void start()"です。つまり、start()メソッドは、引数を取らず、返り値がありません。

したがって、Run()メンバ関数も引数が無く、返り値がありません。


プログラムではエラーが頻繁に発生します。したがって、Run()は、try-catch文で囲われなければなりません。さもないと、Riceソースの間違いによって、アプリケーション自体が強制終了してしまいます。

public Rtype Invoke(string methodname, Queue<Rtype> argqueue)

RiceManagerクラスの"public Rtype Invoke(string methodname, Queue<Rtype> argqueue)"メンバ関数は、Riceのmainクラスの、任意のopenメソッドを呼び出します。

例えば、Riceのmainクラスに"open method int sample(string str, int index)"というメソッドがあるとします。このsampleメソッドをアプリケーション(C#)から呼び出す場合は、次の様にします。


Queue<Rtype> args = new Queue<Rtype>();

args.Enqueue(new Rstring("example"));

args.Enqueue(new Rint(0));

Rint result = Invoke("sample(string,int)", args);


Invoke()メンバ関数の第一引数は、呼び出すopenメソッドのシグネチャを指定します。シグネチャは、メソッド名の後に括弧で囲んだ引数の型名が続く文字列です。引数が複数ある場合は、カンマで区切ります。

第二引数は、メソッドに渡す引数です。シグネチャの引数の順番どうりに適切なRtype派生クラスのインスタンスをQueue<Rtype>型に格納します。

引数が無い場合は、括弧の中は空です。例えば、start()メソッドをInvoke()メンバ関数を使って呼び出す場合の第一引数は、"start()"となります。この場合、第二引数は空のQueue<Rtype>を渡します。nullでないことに注意してください。

Invoke()メンバ関数の結果として、返り値型に指定されたRtype派生クラス(C#)のインスタンスが返ります。呼び出すメソッドの返り値型がvoidのときは、Rvoid型が返ります。


このInvoke()メンバ関数は、シグネチャと引数が合致しているかどうかを考慮しません。正しい引数を用意するのは、プログラマの責任です。


プログラムではエラーが頻繁に発生します。したがって、Invoke()は、try-catch文で囲われなければなりません。さもないと、Riceソースの間違いによって、アプリケーション自体が強制終了してしまいます。

public Rtype Invoke(string methodname, Queue<Rtype> argqueue, bool argCheck)

RiceManagerクラスの"public Rtype Invoke(string methodname, Queue<Rtype> argqueue, bool argCheck)"メンバ関数は、mainクラス(Rice)の、任意のopenメソッドを呼び出します。

このメンバ関数は、"public Rtype Invoke(string methodname, Queue<Rtype> argqueue)"に、引数のチェックを加えたものです。第二引数のクラスと順序がシグネチャと同じかをチェックします。

チェックを実行するかどうかは、メンバ関数の第三引数で指定します。第三引数がtrueならチェックを実行します。falseならチェックは実行されません。


チェックが実行され、引数が合致しない場合は、Exception型の例外がスローされます。


プログラムではエラーが頻繁に発生します。したがって、Invoke()は、try-catch文で囲われなければなりません。さもないと、Riceソースの間違いによって、アプリケーション自体が強制終了してしまいます。

使用例

CookerでのRice言語の呼び出し例を以下に示します。

1:

public static RiceManager Run(string filename, string signature, Queue<Rtype> argqueue) {

2:
3:

List<string> errorMessage = null;

4:

RiceManager rm = null;

5:

try {

6:

rm = new RiceManager(filename); //ファイル名からRiceManagerのインスタンスを生成。

7:

rm.Invoke(signature, argqueue); //指定メソッドの実行。

8:

}

9:

catch(Exception e) {

10:

errorMessage = _makeErrorMessage(e); //例外からエラーメッセージを作成。

11:

}

12:

finally {

13:

if(errorMessage != null) { //エラーメッセージが存在するならエラー。

14:

MessageManager mm = new MessageManager(errorMessage);

15:

mm.ShowModal(); //エラーをダイアログで知らせる。

16:

rm = null; //エラー時にはnullを返す。

17:

}

18:

}

19:

return rm;

20:

}

RiceManagerがスローする例外に対処するために、コンストラクタとInvoke()メンバ関数がtry-catch文で囲まれています。

catchセクション内の_makeErrorMessage()メソッドは例外からダイアログボックスで表示するためのメッセージを作成します。

Copyright © Rice All rights reserved.