For

FORコマンドはGT.M.のループメカニズムを提供します。FORは、M標準規格のスタックモデルの追加レベルを生成しません。

FORコマンドのフォーマットは:

F[OR][lvn=expr[:numexpr1[:numexpr2]][,...]]]

インクリメントとリミット値は、正、負、整数、または少数があります。GT.Mは、FOR制御変数を限界を"超えて"増やしません。他のコマンドは、それを制御するFORの拡張範囲内で、制御変数を変更することがあります。引数にリミットが含まれている場合、そのような変更は、次の繰り返しの開始または不定回数が少ないことが望ましいループの時、制御を得るためにFORの引数を引き起こすことができます。

NOUNDEFは、未定義のFOR制御変数には適用されません。これにより、未定義のFOR制御変数の増分が意図しない無限ループに入るのを防ぎます。たとえば、FOR A=1:1:10 KILL A は、VIEW "NOUNDEF"を指定しても、1から2の増分でUNDEFエラーを返します。

GT.Mは、FORの後の行に現れる明示的なQUITまたはGOTO(またはGT.MではZGOTO)を実行する時に、FORの実行を終了します。リミットのないインクリメントを持つFORコマンドと引数なしFORは、無限ループになります。そのようなFORは、FORの即時的な範囲内で、QUITまたはGOTOで(おそらく後置条件)終了する必要があります。そのようなコマンドによって終了するFORは、制御のメカニズムの "while:の間" または "until:まで" として作用します。また、そのようなFORは、ことはめったにないことですが、DO、XECUTE、および外部関数によって拡張されたFORの範囲内でHALTによって終了できます。

FORの例

例:

GTM>Kill i For i=1:1:5 Write !,i
1
2
3
4
5
GTM>Write i
5
GTM>

このFORループは制御変数 i を持ち、最初の反復で値1(1)を持ち、その次に値2(2)というように、i が値5(5)を持つ最後の繰り返しでまで続きます。FORは、i がその限界を超えてしまうインクリメントで終了します。i が限界を超えてインクリメントされないことに注意してください。

例:

GTM>FOR x="hello",2,"goodbye" WRITE !,x
hello
2
goodbye
GTM>

このFORループは、制御変数 x を使用し、インクリメントまたはリミットを持たない一連の引数を使用しています。制御変数は、文字列値を持つ可能性があることに注意してください。

例:

GTM>For x="hello":1:-1 Write !,x
GTM>ZWRite x
x=0
GTM>

引数がインクリメントを持っているので、FORは "hello"(0)の数値評価のために制御変数 x を初期化しています。次に、増分が正であるので、GT.Mは、行の残りの部分を実行することはありません、制御変数(0)の値がリミット値(-1)より大きい値で初期化します。

例:

GTM>For y=-1:-3:-6,y:4:y+10,"end" Write !,y
-1
-4
-4
0
4
end
GTM>

このFORは、2つのリミット値があるループの引数と1つの値の引数を使用しています。最初の引数は、マイナス1(-1)で y を初期化し、次に、負の4(-4)で yをインクリメントします。別のインクリメントがリミット値(-6)未満で y を引き起こすので、最初の引数が負の4(-4)に等しい y で終了します。2番目の引数は、その現在の値でループ制御変数を初期化し、6(6=-4+10)をリミット値として確立します。 2つの反復の後、再び y をインクリメントすると、リミット値(6)より大きくなる原因となるので、2番目の引数は4(4)に等しい y で終了します。最後の引数はインクリメントがないので、FORは3番目の引数の値に y をセットし、GT.Mは、もう1回FORに続くコマンドを実行します。

例:

GTM>Set x="" For  Set x=$Order(ar(x)) Quit:x=""  Write !,x

この例では、ローカル配列 ar の最初のレベルの添字すべてを調べるために使用される引数なしFORを示しています。$ORDER() がこれ以上の添字が無いこのレベルを示している時は、後置条件QUITはループを終了します。

inserted by FC2 system