Riceにおける文
文
文は、ライスコードを構成するものの一つである。通常、それは実行される何らかの動作を表す。
Riceには、単一文と複合文がある。
単一文は、実行すべき何らかの動作を表現する文である。必ず;(セミコロン)で終了する。
複合文とは、実行の流れを制御するための文である。他の文を包含し、適切なキーワードで終了する。
単一文:
複合文:
宣言文
宣言文は変数名をプログラムに導入し、その変数名にクラスを拘束する。
クラス名 識別子 ;
ほとんどの場合、宣言文におけるクラス名は単純なクラス名の指定である。
int i;
string s;
ただし、コレクションクラスは内部に保持するクラスを指定することができる。コレクションクラスはlist,dictionary,queue,stackである。
list{int} listInt;
stack{string} stackString;
上記のように宣言された変数が指定されたタイプ以外の要素を保持することはできない。
内部に保持するクラスは任意の数を入れ子にすることができる。
list{dictionary{long}} ldl;
stack{queue{list{bool}}} sqlb;
定義文
定義文は変数の宣言と初期化を同時に行う。
クラス名 識別子 = 式 ;
式は適切なクラスのインスタンスのアドレスを返さなければならない。
範囲の大きな数値クラスを範囲の小さな数値クラスで定義できる。
real rr = 10L; // realをlongで定義。
real rrr = 10; // realをintで定義。
long ll = 10; // longをintで定義。
この場合、右辺を基に左辺のクラスが新たに生成されて定義される。
代入文
代入文は左辺値への式の返すアドレスの代入である。
代入文は以下の形式である。
左辺値 = 式 ;
左辺値が識別子かフィールド名で終わる場合は、左辺値が参照するアドレスを式が返すアドレスに変更する。
左辺値がセッタ名で終わる場合は、式を引数にしたセッタ呼び出しに変換される。セッタで何が行われるかはセッタの実装に依存する。
左辺値が [] 演算子で終わる場合は、左辺値が参照するlistクラスのインスタンスの該当するアイテムのアドレスを式が返すアドレスに変更する。
右辺の式は適切なクラスのインスタンスのアドレスを返さなければならない。
Riceの代入は式でなく文である。それはインスタンスのアドレスを返さない。したがって、いくつかの言語のように代入を繰り返すことはできない。
int i;
int j;
int k;
i = j = k = 10; // エラー!
範囲の大きな数値クラスへ範囲の小さな数値クラスを代入できる。
real rr;
rr = 10L; // real へ long を代入。
rr = 10; // real へ int を代入。
long ll;
ll = 10; // long へ int を代入。
この場合、右辺が返すインスタンスを基に左辺値のクラスのインスタンスが新たに生成されて、それが代入される。
複合代入文
複合代入文は左辺と右辺の算術演算と、その結果の代入を同時に行う省略記法である。
左辺値 *= 式 ;
左辺値 /= 式 ;
左辺値 %= 式 ;
左辺値 += 式 ;
左辺値 -= 式 ;
それぞれが以下の代入文と等価である。
左辺値 = 左辺 * 右辺 ;
左辺値 = 左辺 / 右辺 ;
左辺値 = 左辺 % 右辺 ;
左辺値 = 左辺 + 右辺 ;
左辺値 = 左辺 - 右辺 ;
算術演算は個々の演算子の規則に従い、代入は代入文の規則に従う。
呼出文
メソッド呼び出しで終わる式にセミコロンが続いた文は、呼出文である。
ドット演算の後にメソッド呼び出しで終わる呼出文は、ドットの左側が返すインスタンスのメソッドを呼び出す。
ドット演算の無いメソッド呼出文は、現在のインスタンスのメソッドを呼び出す。
インクリメント文
後置++演算子で終わる式にセミコロンが続いた文は、インクリメント文である。
演算子の左辺の値をインクリメントする。値は、int,long,realでなければならない。
オペランドがproxyクラスを返した場合は、proxyの実体が使用される。
前置++演算子によるインクリメント文は無い。
デクリメント文
後置--演算子で終わる式にセミコロンが続いた文は、デクリメント文である。
演算子の左辺の値をデクリメントする。値は、int,long,realでなければならない。
オペランドがproxyクラスを返した場合は、proxyの実体が使用される。
前置--演算子によるデクリメント文は無い。
return文
サブルーチンの実行を停止し、サブルーチンの呼び出し元へと制御を返す。returnの後に式が続く場合は、式の返す値を返り値として呼び出し元へ返す。式が無いときはvoidクラスのインスタンスが返される。
return ;
return 式 ;
戻り値のクラスはサブルーチン定義の戻り値のクラスと一致しなければならない。
上記のサブルーチンとは、フィッタ、セッタ、ゲッタ、メソッドである。フィッタとセッターは値を返さないので、式を持つreturn文を使用するとエラーが発生する。
break文
break文を囲む直近のループ文の、次の文に制御をジャンプする。
break ;
上記のループ文とは、while文、fromto文、keepon文、each文である。
continue文
continue文を囲む直近のループ文の、先頭の文に制御をジャンプする。
continue ;
上記のループ文とは、while文、fromto文、keepon文、each文である。
throw文
例外が発生したことを通知するために、errorクラスのインスタンスをスローする。
制御はthrow文を囲む直近のtry文を発見するまで呼出履歴を遡る。
try文を発見した場合、そのtry文がcatch節を持てばcatch節の先頭の文へ制御をジャンプする。catch節を持たなければtry文の次へ制御をジャンプする。
try文を発見できなかった場合はプログラムが終了する。
throw ;
throw 式 ;
throw文がtry文のcatch節から例外を通知する場合は、制御はtry文を囲むtry文を発見するまで呼出履歴を遡る。
throw文が式を持たない場合は、スローされるerrorクラスのインスタンスのExceptionDataゲッタは、未初期化のproxyクラスのインスタンスである。
throw文が式を持つ場合は、スローされるerrorクラスのインスタンスのExceptionDataゲッタは、式で初期化されたproxyクラスのインスタンスである。
throw文の式が__errorの場合は、__errorが再スローされる。
if文
if文は、条件によって実行の流れを分岐するための文である。
if(条件式)
文
elseif(条件式)
文
else
文
endif
if節とelseif節の括弧内の式は条件式である。条件式が真の場合、その節の文が実行される。条件式が偽の時は、次のelseif節に同様の動作を繰り返す。
条件式が数値を返す場合、非ゼロならば真と評価され、ゼロならば偽と評価される。
条件式がproxyクラスを返した場合は、proxyの実体が条件式として使用される。
elseif節はif文内に任意の数だけ存在できる。全ての条件式が偽でelse節があれば、else節の文が実行される。
if文はendifで終了しなければならない。
endifの代わりに省略形のeiを使用できる。
if文の節はスコープを生成する。スコープについては、マニュアルを参照すること。
while文
while文は、条件によって実行のループを制御するための文である。
while(条件式)
文
endwhile
whileに続く括弧内の式は条件式である。条件式が真の時、while文内の先頭の文に制御が移動する。条件式が偽の時は、endwhileの次の文に制御が移動する。
条件式が数値を返す場合、非ゼロならば真と評価され、ゼロならば偽と評価される。
条件式が proxy クラスを返した場合は proxy の実体が条件式として使用される。
制御がcontinue文に到達するか、endwhileまで達したときは、whileに制御が移動し条件式の評価から実行を繰り返す。
制御がbreak文に到達すると、endwhileの次の文に制御が移動する。
while文はendwhileで終了しなければならない。
endwhileの代わりに省略形のewを使用できる。
fromto文
fromto文は、ループインデックスによって実行のループを制御するための文である。
fromto(式,式)
文
endfromto
最初の式はループインデックスの開始値であり、二番目の式は終了値である。
両者はintを返す式でなければならず、fromtoの最初に決定される。ループの最中にその値が変わることは無い。
開始値と終了値がproxyクラスを返した場合は、proxyの実体が値として使用される。
開始値と終了値が等しい場合、ループは実行されずにendfromtoの次に制御を移動する。
開始値<終了値の場合、ループインデックスが、ループ毎に1加算される。ループインデックスと終了値が等しくなれば、endfromtoの次に制御を移動する。
開始値>終了値の場合、ループインデックスが、ループ毎に1減算される。ループインデックスと終了値が等しくなれば、endfromtoの次に制御を移動する。
制御がcontinue文に到達するかendfromtoまで達したときは、fromtoに制御が移動しループインデックスの評価から実行を繰り返す。
制御がbreak文に到達するとendfromtoの次に制御が移動する。
fromto文はendfromtoで終了しなければならない。
endfromtoの代わりに省略形のeftを使用できる。
keepon文
keepon文は、回数でループを制御するための文である。
keepon(式)
文
endkeepon
式はループ回数である。
ループ回数はintを返す式でなければならず、keeponの最初に決定される。ループの最中にその値が変わることは無い。
ループ回数がproxyクラスを返した場合は、proxyの実体がループ回数として使用される。
ループ回数がゼロ以下の場合、ループは実行されずにendkeeponの次に制御を移動する。
ループ回数が1以上の場合、その回数分ループが実行される。実行終了後はendkeeponの次に制御を移動する。
制御がcontinue文に到達するかendkeeponまで達したときは、keeponに制御が移動し実行を繰り返す。
制御がbreak文に到達するとendkeeponの次に制御が移動する。
keepon文はendkeeponで終了しなければならない。
endkeeponの代わりに省略形のekoを使用できる。
each文
each文は、コレクションの要素によって実行のループを制御するための文である。
each(式)
文
endeach
式はコレクションの指定であり、listかdictionaryかqueueかstackを返さなければならない。
式がproxyクラスを返した場合は、proxyの実体がコレクションの指定として使用される。
制御がcontinue文に到達するかendeachまで達したときは、endeachに制御が移動しコレクションの次の要素に実行を繰り返す。
制御がbreak文に到達するとendeachの次に制御が移動する。
each文はendeachで終了しなければならない。
endeachの代わりに省略形のeeを使用できる。
each文はスコープを生成する。スコープについては、マニュアルを参照すること。
each文はeach文内の先頭の文に制御が到達すると、予約変数__countと__indexを定義し__keyと__valueを宣言する。
__countと__indexはintクラスの変数であり、ゼロから始まるループ回数で初期化される。
__keyはstringクラスの変数であり、コレクションがdictionaryの場合は要素のkeyで初期化される。それ以外のコレクションの場合は空文字列である。
__valueはコレクションの要素で初期化される。__valueのクラスは要素のクラスに依存する。
__countと__indexは通常のintクラスのようにオーバーフローが発生することはない。__countと__indexがintクラスの最大値を超えた場合は、ゼロに戻る。
try文
try文は、例外によって実行の流れを分岐するための文である。
try
文
catch
文
endtry
try節の中で例外が発生してcatch節があれば、catch節の中の最初の文に制御が移動する。catch節が無ければ、endtryの次に制御が移動する。
try節の中で例外が発生しなかった場合、catch節はスキップされ、endtryの次に制御が移動する。
try文はendtryで終了しなければならない。catch節は任意である。
endtryの代わりに省略形のetを使用できる。