FORコマンドはGT.M.のループメカニズムを提供します。FORは、M標準規格のスタックモデルの追加レベルを生成しません。
FORコマンドのフォーマットは:
F[OR][lvn=expr[:numexpr1[:numexpr2]][,...]]]
FORは条件付きコマンドなので、コマンドは後置条件をサポートしていません。
FORの範囲は、行の残りの部分です。FORの範囲は、DO(またはXECUTE)コマンドを使用して拡張できます。
FORに引数がない時、行の中で次のコマンドと区別するために、コマンドに続き少なくとも2つのスペースが必要です。これは、QUIT、HALT、GOTO、またはZGOTOにより終了する必要があるループを指定します。
オプションのローカル変数名は、等号(=)によって区切られたループの制御変数を指定します。FORコマンドは、複数の引数がある場合でも、唯一1つの制御変数を持ちます。
FORを開始するとき、GT.Mは式のループ制御変数の値を割り当てます。初期値だけが現れる時、GT.Mは、数値である制御変数を強制することなく、その引数に対して一度だけ行の残りを実行します。
もし引数がインクリメントとオプションでターミネータを含んでいる場合は、GT.Mは数値として最初の式を扱います。
最初のコロン(:)デリミタの後のオプションの数値式(numexpr1)は、各反復の増分値を指定します。FORコマンドは、最初の反復で、コントロール変数をインクリメントしません。
2番目のコロン(:)区切り文字の後のオプションの数値式(numexpr2)は、制御変数のリミット値を指定します。このターミネータ式は、制御変数が対応する初期値に初期化される時にのみ、評価され、次に、後続するすべての反復で使用されます。
GT.Mは、以下のような、FORに続く同じ行の上でコマンドを実行しません:
増分が負でなく、制御変数の初期値がリミット値よりも大きい。
増分が負の値であり、制御変数の初期値がリミット値よりも小さい。
以下のように、最初の反復の後で、GT.Mは制御変数を変更しません、そして、FORの制御下で実行が終わります:
増分が負でなく、インクリメントによって制御変数を変更すると、制御変数がリミット値より大きくなることを引き起こします。
増分が負の値であり、インクリメントによって制御変数を変更すると、制御変数がリミット値未満になることを引き起こします。
FORが複数の引数を持つ場合、それぞれが順番にループの制御変数に影響を与えます。引数が制御を得るには、FORへの前の引数は、リミットなしで増分を持つことはできません。
インクリメントとリミット値は、正、負、整数、または少数があります。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によって終了できます。
例:
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はループを終了します。