IF (ObjectScript)
構文
IF expression1,... { code }
ELSEIF expression2,... { code }
ELSE { code }
あるいは
I expression1,... { code }
ELSEIF expression2,... { code }
ELSE { code }
引数
引数 | 説明 |
---|---|
expression1 | IF 節のブーリアン・テスト条件。単一の条件、またはコンマで区切られた条件のリスト。 |
expression2 | ELSEIF 節のブーリアン・テスト条件。単一の条件、またはコンマで区切られた条件のリスト。 |
code | 中括弧で囲まれた ObjectScript コマンドのブロックです。 |
概要
ここでは、IF、ELSEIF、および ELSE コマンド・キーワードについて説明します。これらはすべて、IF コマンドの構成要素節と見なされます。IF キーワードは、I と省略できます。他の 2 つのキーワードは省略できません。
1 つの IF コマンドには 1 つの IF 節が含まれ、その後に任意の数の ELSEIF 節、最後に 1 つの ELSE 節と続きます。ELSEIF 節と ELSE 節はオプションですが、ELSE 節は常に指定する方がわかりやすいプログラムになります。
IF コマンドは最初に IF 節の expression1 を評価し、expression1 が True の場合、それに続く中括弧内のコード・ブロックを実行し、IF コマンドを終了します。
expression1 が False の場合、IF 文の次の節に実行を移します。(存在する場合は) 最初の ELSEIF 節を評価します。ELSEIF 節内の expression2 が True の場合、それに続く中括弧内の ELSEIF コード・ブロックを実行し、IF コマンドを終了します。expression2 が False の場合、次の ELSEIF 節 (ある場合) が同様に評価されます。後続の各 ELSEIF 節は、それらの 1 つが True と評価されるまで、あるいはすべてが False と評価されるまでリストの順序でテストされます。
IF 節とすべての ELSEIF 節が False と評価された場合、実行は ELSE 節に移動します。それに続く中括弧内の ELSE コード・ブロックを実行し、IF コマンドを終了します。ELSE 節が省略されている場合、IF コマンドを終了します。
IF はブロック型のコマンドです。各コマンド・キーワードの後には、中括弧 ( { } ) で囲まれたコード・ブロックが続きます。IF 節、ELSEIF 節、および ELSE 節は余白 (改行、インデント、空白スペース) を自由に使用できます。ただし、各 IF キーワードと ELSEIF キーワードはそれぞれ、ブーリアン・テスト式の最初の文字と同じ行に置き、1 つの空白スペースで区切る必要があります。ブーリアン・テスト式は複数行に記述でき、また複数の空白スペースを含むことができます。
開き中括弧や閉じ中括弧は、1 行で独立して記述するか、コマンドと同じ行に記述できます。開き中括弧や閉じ中括弧は、列 1 に記述してもかまいませんが、お勧めはできません。推奨されるプログラミング手法として、入れ子になったコード・ブロックの開始と終了を示すために、中括弧はインデントするようにしてください。開き中括弧の前後に空白を入れる必要はありません。閉じ中括弧の前後に空白を入れる必要はありません。引数のないコマンドに続く中括弧の場合も同様です。中括弧の空白に関する唯一の要件は、IF コマンドの最後の節の最後の閉じ中括弧とその後のコマンドを、スペース、タブ、または改行で区切る必要があるということです。
IF コマンドは別の IF コマンド内に入れ子にすることができます。複数レベルの入れ子がサポートされます。
IF コマンドは、$TEST 特殊変数の値の読み取りや設定を行いません。ブーリアン・テスト式が True と評価されると、$TEST の値にかかわらず、中括弧内のコード・ブロックを実行します。
引数
expression1
IF 節のテスト条件。単一の式かコンマで区切られた式のリストの形式をとります。式リストでは、InterSystems IRIS は左から右の順で、個別の式を評価します。コンマ区切りリスト内で False に評価される式に遭遇すると評価を終了します。コンマ区切りリスト内のすべての式が True と評価されると、InterSystems IRIS は IF 節に関連するコード・ブロックを実行します。リスト内の式が 1 つでも False と評価されると、InterSystems IRIS は残りの式を無視し、IF 節に関連するコード・ブロックを実行しません。
通常、expression1 は True または False と評価されるブーリアン式です (x=7 など)。"演算子と式" を参照してください。IF は、以下のようにリテラル値をブーリアンの True および False として解釈します。
-
TRUE : ゼロ以外の数値、またはゼロ以外の数値に評価される数値文字列。例 : 1、7、-.007、"7-7"、"7dwarves"。
-
FALSE : ゼロの数値、またはゼロの数値に評価される文字列。ゼロの数値に評価される非数値文字列。0、-0.00、7-7、"0"、"TRUE"、"FALSE"、"strike3"、空文字列 ("") など。
詳細は、"数値としての文字列" を参照してください。
expression2
ELSEIF 節のテスト条件。単一の式かコンマで区切られた式のリストの形式をとります。これは expression1 と同じ方法で評価されます。
QUIT での IF
QUIT コマンドが IF コード・ブロック (あるいは ELSEIF コード・ブロックまたは ELSE コード・ブロック) 内にある場合、QUIT は、このコード・ブロックが存在しないかのように、通常の QUIT コマンドとして動作します。この動作は、その他の種類の中括弧のコード・ブロック (FOR、WHILE、DO...WHILE、TRY、CATCH) 内にある QUIT と異なります。
-
IF コード・ブロックが、ループ構造 (FOR コード・ブロックなど) 内で入れ子にされている場合、QUIT はそのループ構造ブロックを終了し、このループ構造コード・ブロックに続くコマンドで実行を続けます。
-
IF コード・ブロックが TRY ブロックまたは CATCH ブロック内にある場合、QUIT は TRY ブロックまたは CATCH ブロックを終了し、TRY ブロックまたは CATCH ブロックに続くコマンドで実行を続けます。
-
IF コード・ブロックがループ構造内または TRY ブロックまたは CATCH ブロックで入れ子にされていない場合は、QUIT は現在のルーチンを終了します。
RETURN を発行すると、ブロック構造内で発行されたどうかに関係なく、現在のルーチンが終了します。
以下の例では、IF がループ構造内にない場合の QUIT の動作を示しています。QUIT はルーチンを終了します。
SET y=$RANDOM(10)
IF y#2=0 {
WRITE y," is even",!
QUIT
WRITE "never written"
}
ELSE {
WRITE y," is odd",!
QUIT
WRITE "never written"
}
WRITE "QUIT out of the IF (never written)"
以下の例では、IF がループ構造内にある場合の QUIT の動作を示しています。QUIT は、FOR ループを終了してルーチンの実行を続けます。
FOR x=1:1:8 {
IF x#2=0 {
WRITE x," is even",!
QUIT:x=4
}
ELSE {
WRITE x," is odd",!
}
}
WRITE "QUIT out of the FOR loop (written)"
以下の例では、IF が TRY ブロック内にある場合の QUIT の動作を示しています。QUIT が TRY ブロックを終了した後、CATCH ブロックに続く次のコードでルーチンの実行が継続されます。
TRY {
SET y=$RANDOM(10)
IF y#2=0 {
WRITE y," is even",!
QUIT
WRITE "never written"
}
ELSE {
WRITE y," is odd",!
QUIT
WRITE "never written"
}
WRITE "QUIT out of the IF (never written)"
}
CATCH exp1 {
WRITE "only written if an error occurred",!
WRITE "Error Name: ",$ZCVT(exp1.Name,"O","HTML"),!
}
TRY {
WRITE "on to the next TRY block"
}
CATCH exp2 {
WRITE "only written if an error occurred",!
WRITE "Error Name: ",$ZCVT(exp2.Name,"O","HTML"),!
}
GOTO での IF
IF コード・ブロック内に GOTO がある場合、プログラムは特定の制限に従い実行されます。
GOTO 文は IF コマンドの外側、あるいは現在の節のコード・ブロック内に移動できます。GOTO 文は他のコード・ブロックには移動できません。つまり、現在の IF コマンドの別の節に属するコード・ブロックや、他の IF、FOR、DO WHILE、または WHILE コマンドに属するコード・ブロックには移動できません。
例
以下の例では、IF コマンドを使用して、回答者を 3 つのグループのいずれかに分類し、適切なサブルーチンを呼び出します。3 つのグループは、44 歳以下の女性のグループ、44 歳以下の男性のグループ、45 歳から 120 歳までの男女のグループです。この例では、性別評価式は包含関係演算子 ( [ )を使用します。("演算子と式" を参照してください。)
Mainloop
NEW sex,age
READ !,"What is your sex? (M or F): ",!,sex QUIT:sex=""
READ !,"What is your age? ",!,age QUIT:age=""
IF "Ff"[sex,age<45 {
DO SubA(age)
}
ELSEIF "Mm"[sex,age<45 {
DO SubB(age)
}
ELSEIF "FfMm"[sex,age>44,age<125 {
DO SubC(age)
}
ELSE {
WRITE !,"Invalid data value input"
}
SubA(y)
WRITE !,"Young woman ",y," years old"
SubB(y)
WRITE !,"Young man ",y," years old"
SubC(y)
WRITE !,"Older person ",y," years old"