Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

IF

式を評価し、式の真理値を基にして、実行するコード・ブロックを選択します。

Synopsis

IF expression1,... {
  code
}
ELSEIF expression2,... {
    code
}
ELSE {
    code
}

あるいは

I expression1,... {
  code
}
ELSEIF expression2,... {
    code
}
ELSE {
    code
}

引数

expression1 IF 節のブーリアン・テスト条件。単一の条件、またはコンマで区切られた条件のリスト。
expression2 ELSEIF 節のブーリアン・テスト条件。単一の条件、またはコンマで区切られた条件のリスト。
code 中括弧で囲まれた ObjectScript コマンドのブロックです。

概要

ここでは、IFELSEIFELSE コマンド・キーワードの説明をします。これらのすべては、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 コマンドの最後の節の最後の閉じ中括弧とその後のコマンドを、スペース、タブ、または改行で区切る必要があるということです。

Note:

初期の行型 IF コマンド構文は、従来のアプリケーションに存在している場合があります。この IF の行型形式は中括弧を使用せず、ELSEIF 節をサポートしていません。これら IF の 2 つの形式は、構文構造の違いにより結合できません。したがって、あるタイプの IF は、別のタイプの ELSE と組み合わせることができません。初期の行型 ELSE は、E と省略することができますが、ブロック型の ELSE キーワードは省略できません。

ブロック型 IF が行型 IF 内で入れ子にされているプログラムにおいて、ブロック型 IF には ELSE 節が必要になります。以下は有効な構文です。

  IF x=1 WRITE "x is 1"
     IF y=1 { WRITE "y is 1" }
     ELSE { WRITE "y is not 1" }
  ELSE  WRITE "x is not 1"

以下は有効な構文ではありません。

  IF x=1 WRITE "x is 1"
     IF y=1 { WRITE "y is 1" }
  ELSE  WRITE "x is not 1"

このブロック型 IF コマンドは、$TEST 特殊変数の値の読み取りや設定を行いません。ブーリアン・テスト式が True と評価されると、$TEST の値にかかわらず、中括弧内のコード・ブロックを実行します。

引数

expression1

IF 節のテスト条件。単一の式かコンマで区切られた式のリストの形式をとります。式リストでは、Caché は左から右の順で、個別の式を評価します。コンマ区切りリスト内で False に評価される式に遭遇すると評価を終了します。コンマ区切りリスト内のすべての式が True と評価されると、Caché は IF 節に関連するコード・ブロックを実行します。リスト内の式が 1 つでも False と評価されると、Caché は残りの式を無視し、IF 節に関連するコード・ブロックを実行しません。

通常、expression1 は True または False と評価されるブーリアン式です (x=7 など)。"Caché ObjectScript の使用法" の "演算子と式" の章を参照してください。IF は、以下のようにリテラル値をブーリアンの True および False として解釈します。

  • TRUE : ゼロ以外の数値、またはゼロ以外の数値に評価される数値文字列。例 : 1、7、-.007、"7-7"、"7dwarves"。

  • FALSE : ゼロの数値、またはゼロの数値に評価される文字列。ゼロの数値に評価される非数値文字列。0、-0.00、7-7、"0"、"TRUE"、"FALSE"、"strike3"、空文字列 ("") など。

詳細は、"Caché ObjectScript の使用法" の “データ型とデータ値” の章の "数値としての文字列" を参照してください。

expression2

ELSEIF 節のテスト条件。単一の式かコンマで区切られた式のリストの形式をとります。これは expression1 と同じ方法で評価されます。

QUIT での IF

QUIT コマンドが IF コード・ブロック (あるいは ELSEIF コード・ブロックまたは ELSE コード・ブロック) 内にある場合、QUIT は、このコード・ブロックが存在しないかのように、通常の QUIT コマンドとして動作します。この動作は、その他の種類の中括弧のコード・ブロック (FOR、WHILE、DO...WHILE、TRY、CATCH) 内にある QUIT と異なります。

  • IF コード・ブロックが、ループ構造 (FOR コード・ブロックなど) 内で入れ子にされている場合は、QUIT はそのループ構造ブロックを終了し、このループ構造コード・ブロックに続くコマンドで実行を続けます。

  • IF コード・ブロックが TRY ブロックまたは CATCH ブロック内にある場合は、QUITTRY ブロックまたは 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)"

以下の例では、IFTRY ブロック内にある場合の QUIT の動作を示しています。QUITTRY ブロックを終了した後、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 コマンドの別の節に属するコード・ブロックや、他の IFFORDO WHILE、または WHILE コマンドに属するコード・ブロックなどです。

以下の例では、IF コマンドを使用して、回答者を 3 つのグループのいずれかに分類し、適切なサブルーチンを呼び出します。3 つのグループは、44 歳以下の女性のグループ、44 歳以下の男性のグループ、45 歳から 120 歳までの男女のグループです。この例では、性別評価式は包含関係演算子 ( [ )を使用します。(詳細は、"Caché ObjectScript の使用法" の "演算子" を参照してください。)

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"

関連項目

FeedbackOpens in a new tab