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?

FOR (従来のバージョン)

各ループの最初でテストしながら、コマンド・ループを繰り返し実行します。

Synopsis

FOR variable=forparameter,... command
F variable=forparameter,... command

forparameter には、以下を指定できます。

expr
start:increment
start:increment:end

command は、同じプログラム行の 1 つまたは複数の ObjectScript コマンドです。このコマンドは、FOR テストを基にして繰り返し実行されます。

引数

variable オプションFOR ループのカウンタ変数
expr オプション — ループ・コマンドを実行する前の variable の値
start オプションFOR ループの最初の反復時の variable の値
increment オプションFOR ループの各反復後の variable のインクリメントに使用される値
end オプションFOR ループを終了するのに使用される値

説明

Note:

このページでは、FOR コマンドの従来のバージョンについて説明します。このバージョンは Caché 4.0 時点で従来のバージョンとして見なされるもので、新規のプログラミングでは使用すべきではありません。ここでは、従来のアプリケーションとの互換性について説明します。

従来の FOR コマンドは行型です。実行されるループは、同じプログラム行の FOR の後に続くコマンドで構成されています。{ } 括弧は使用されず、行フォーマット化の使用は制限されます。新規の FOR コマンドはブロック型です。実行されるループは、FOR コマンドの後に続く { } 括弧で囲まれたコマンドで構成されています。行フォーマット (空白や改行) は制限されていません。

FOR コマンドには、以下の 2 つの基本的な形式があります。

  • 引数なし

  • 引数付き

引数なしの FOR

引数なしの FOR は、同じ行のそれに続くコマンドを無限に実行します。Caché は QUITGOTO コマンドに出会うまで、そのコマンドを繰り返します。

引数なしの FOR キーワードは、後に続くコマンドと少なくとも 2 つの空白スペースで区切られる必要があります。

引数付きの FOR

FOR が実行する動作は、使用する引数形式によって異なります。

FORvariable=expr は、variableexpr の値を代入してから、同じ行の FOR の後のコマンドを実行します。

FOR variable=start:increment は、同じ行の FOR の後のコマンドを無限に実行します。最初の反復で、Caché は variable を start に設定します。FOR コマンドの各実行では、指定された increment の値で variable の値をインクリメントします。Caché は QUIT または GOTO コマンドに遭遇するまで、そのコマンドを繰り返します。

FOR variable=start:increment:end は、variable を start の値に設定します。Caché は、同じ行の FOR の後のコマンドを、以下のテーブルの条件に基づいて実行します。

increment が正の場合 increment が負の場合
start > end の場合、FOR を実行しません。variable > (end - increment) の場合、または QUIT コマンドや GOTO コマンドに出会った場合は終了します。 start<end の場合、FOR を実行しません。variable<(end-increment) の場合、または QUIT コマンドや GOTO コマンドに出会った場合は終了します。

コマンドの実行を開始するとき、Caché は startincrement、および end の各値を評価します。ループ内でこれらの値が変更されてもそれは無視され、ループ実行回数に影響を与えません。

ループが終了したとき、variable はループの最後の実行結果によるインクリメントを反映する値になります。しかし、variable は end で指定された最大値を超えることはありません。

引数

variable

FOR ループの現在のカウントを保持する変数です。FOR コマンドの他の引数によって指定された数値を保持する、ローカル変数名です。

expr

ループ・コマンドを実行する前に Caché が variable に代入する数値です。expr 値は、リテラルあるいは有効な式として指定されます。Caché はその数値に対して expr を評価します。

start

FOR ループの最初の反復時に variable に割り当てられる数値。start 値は、リテラルあるいは有効な式として指定されます。Caché は start をその数値に対して評価します。

increment

FOR ループの各反復後に、variable をインクリメントするのに使用される数値。start を指定している場合、increment は必須です。increment 値は、リテラルあるいは有効な式として指定されます。Caché は increment をその数値に対して評価します。

end

FOR ループを終了させるために使用する数値。variable がこの値と同じ場合、FOR ループは最後の 1 回を実行し、その後終了します。end 値は、リテラルあるいは任意の有効な式として指定されます。Caché は end をその数値に対して評価します。

引数なしのFOR

以下の例では、引数なしの FOR を示しています。ユーザは、後の DO コマンドで Calc サブルーチンへ渡す数の入力を繰り返し求められます。FOR ループは、ユーザが NULL 文字列を入力する (数値を入力せずに [Enter] を押す) と QUIT コマンドを実行し、終了します。引数なしの FOR キーワードは、後に必ず 2 つ (以上) のスペースを空けて続きます。

FOR  READ !,"Number: ",num QUIT:num=""  DO Calc(num)

FORvariable=expr の使用法

variable=expr を指定する場合、Caché は FOR コマンドを一度実行します。expr の値は、リテラルまたは有効な式です。式を指定する場合、式は単一の数値に評価される必要があります。

以下の例は、num 値を 4 に設定して、FOR コマンド行にある WRITE コマンドを一度実行します。結果は、数値 12 を記述します。

  SET val=4
  FOR num=val WRITE num*3 QUIT

FORvariable=start:increment:end の使用法

引数 startincrementend は、それぞれ初期値、増分値、終値を指定します。これら 3 つの値は、数値として評価されます。これは整数または実数、正または負の値です。文字列値を提供する場合は、ループの開始時に同等の数値に変換されます。

初めて Caché がループに入ると、start 値を variable に代入しvariable の値と end 値を比較します。variable 値が end 値より小さい場合 (または increment 値が負のときは end 値より大きい場合)、Caché はループ・コマンドを実行します。その後 increment の値を使用して、variable の値を更新します (負の increment が使用されている場合、variable の値はディクリメントされます)。

ループの実行は、variable の値が end 値を上回るまで (等しいだけでなく)、(または Caché が QUITGOTO に出会うまで) 続けられます。この時点で、variable が end 値を超えないために、Caché は変数割り当てとループ実行終了を抑制します。variable 値が end 値と等しい場合、Caché は FOR ループの最後の 1 回を実行した後、ループを終了します。

以下のコードは、最後の 2 文字を除く string1 のすべての文字に WRITE コマンドの実行を繰り返し、順番に出力します。end の値が len-2 と指定されていても、最後の文字だけがスキップされます。これは変数の値が end の値を超えたとき (一致したときではなく) にだけ、ループが終了されるからです。

  SET len=$LENGTH(string1)
  FOR index=1:1:len-2 WRITE $EXTRACT(string1,index)

FORvariable=start:increment の使用法

この FOR コマンドの形式には、end 値がありません。FOR 以下のコマンドが、ループを終了させるための QUIT コマンドや GOTO コマンドを含む必要があります。多くの場合、FOR が、QUITGOTO コマンドを含む DO ループを呼び出します。

startincrement の値は、数値として評価されます。これは整数または実数、正または負の値です。文字列値の場合は、ループの開始時に同等の数値に変換されます。ループの実行を開始するとき、Caché は start および increment の値を評価します。ループ内でこれらの値が変更されても、それは無視されます。

ループの開始時に start 値を variable に代入し、ループ・コマンドを実行します。その後 increment の値を使用して、variable の値を更新します (負の increment が使用されている場合、variable の値はデクリメントされます)。Caché は QUIT コマンド、または GOTO コマンドに遭遇するまでループの実行を繰り返します。

以下の例では、FOR variable=start:increment 形式を使用して、ユーザが入力した一連の数の平均値を計算します。ユーザが NULL を入力したとき (つまり、数値を入力せずに [Enter] を押したとき) にループを終了するため、後置条件 QUIT が含まれています。後置条件式 (num="") が True の場合、Caché は QUIT を実行し、DO ループを終了します。

ループ・カウンタ (変数 i) は、入力された数字の数を記録するために使用されます。i は、0 に初期化されます。これは、ユーザの数値入力後にカウンタがインクリメントされるためです。Caché は、この最後の実行の後、ループを終了します。ループが終了された後、平均を計算するため、SET コマンドは (ローカル変数として) i を参照します。

  SET sum=0
  FOR i=0:1 DO Averageloop
  SET average=sum/i
Averageloop
    READ !,"Number: ",num 
    QUIT:num="" 
    SET sum=sum+num

インクリメント構文での FOR の詳細な例

FOR variable=start:increment 形式の以下の例では、ユーザに数値入力を求め、その後、その数と x の現在の値を DO コマンドで実行される Calc サブルーチンに渡します。x の初期値は 1 で、ループの実行ごとに 1 ずつインクリメントされます。FOR ループは、ユーザが [Enter] を押すと QUIT コマンドを実行し、終了します。

  FOR x=1:1 READ !,"Number: ",num QUIT:num="" DO Calc(num,x)
Calc(a,b)

FOR variable=start:increment:end 形式の以下の例では、ユーザに数値入力を求め、その後、その数値を DO コマンドで実行される Calc サブルーチンに渡します。x の初期値は 1 で、ループの実行ごとに 1 ずつインクリメントされます。FOR ループは、x の値が end 値 (3) を超える、あるいはユーザが [Enter] を押すと QUIT コマンドを実行し、終了します。

Mainloop
  FOR x=1:1:3 READ !,"Number: ",num QUIT:num="" DO Calc(num)
Calc(a)

FORvariable=start:increment:end 形式の以下の例では、WRITE コマンドが決して実行されることのない FOR ループを示します。これは、i の最初の値 (10) が、end 値 (1) から increment 値 (1) を減算した値よりも既に大きいためです。

   FOR i=10:1:1 WRITE i

以下の例は、10 回 WRITE コマンドを実行し、i = 10 で終了する FOR ループです。

   FOR i=1:1:10 WRITE i

以下の例は、10 回 WRITE コマンドを実行し、i = 11 で終了する FOR ループです。

  SET i=1 
  FOR i=1:0:10 WRITE i,! SET i=i+1

複数の forparameters を持つ FOR を使用する

単一の FOR コマンドには、両方のタイプのパラメータ構文を含めることができます。以下は、複数の forparameters 付きの FOR の例です。最初の forparameterexpr 構文です。2 番目の forparameterstart:increment:end 構文です。2 つの forparameters はコンマで区切られています。初めて FOR を使用するとき、Caché は expr 構文を使用し、y の値と等しい x を持つ Test サブルーチンを呼び出します。2 度目 (およびそれ以降) の反復では、Caché は start:increment:end 構文を使用します。x に 1 を、その次には 2 を設定し、最後の繰り返しで x=10 となります。

Mainloop
  FOR x=y,1:1:10 DO Test
Test

引数なしの FOR のインクリメント

引数なしの FORFOR variable=start:increment 形式と同じように動作します。唯一の違いは、ループ実行回数を記録する方法を提供していないことです。引数なしの FOR コマンドでは、FOR キーワードの後に 2 つ (以上) のスペースが必要です。

以下の例は、前述のループ・カウンタ例を引数なしの FOR を使用して、どのように書き直しているかを表しています。i = i + 1 がループ・カウンタの代わりです。引数なしの FOR キーワードの後に 2 つのスペースが必要なことに注意してください。

Average2loop
  SET sum=0
  SET i=0
  FOR  READ !,"Number: ",num QUIT:num="" SET sum=sum+num,i=i+1
  SET average=sum/i
  WRITE !!,"Average is: ",average
  QUIT

メモ

FOR および監視ポイント

FOR と組み合わせた監視ポイントの使用には制限があります。FOR コマンドの制御 (インデックス) 変数に対する監視ポイントを確立する場合、Caché は、各 FOR コマンド引数を最初に評価するときだけ、指定された監視ポイント・アクションをトリガします。この制約は、パフォーマンスの向上が目的です。

以下の例には、監視される変数 x に対して、3 種類の FOR コマンド引数が含まれています。1 つは初期値、増分値、制限 (最終値) を持つ値域、もう 1 つは単一の値、そしてもう 1 つは初期値、増分値を持ち、制限を持たない値域です。X の初期値が 1、20、50 になると、ブレークが実行されます。

USER>ZBREAK *X
USER>FOR X=1:1:10,20,50:2 SET T=X QUIT:X>69
<BREAK>
USER 2f0>w
X=1
USER 2f0>g
USER>FOR X=1:1:10,20,50:2 SET T=X QUIT:X>69
<BREAK>
USER 2f0>w
T=10
X=20
USER> 2f0>g
USER>FOR X=1:1:10,20,50:2 SET T=X QUIT:X>69
<BREAK>
USER 2f0>w
T=20
X=50
USER 2f0>g
USER>w
T=70
X=70

FOR ループを QUIT、または GOTO で終了する

FOR ループは、QUIT がループ・コマンドにある場合にだけ、QUIT で終了されます。Caché が DO コマンドによって呼び出されたサブルーチン内で QUIT に遭遇した場合は、FOR ループ自体ではなくそのサブルーチンだけを終了します。

FOR ループは、ループ内にある GOTO によって終了されます。GOTODO コマンドによって呼び出されたサブルーチンを終了した場合、Caché はサブルーチンと FOR ループの両方を終了します。

関連項目

FeedbackOpens in a new tab