NEWコマンドは、ローカル変数のコピーを "スタック" し、そして、それら変数を再初期化します。DO、XECUTE、外部関数からの明示的または暗黙的なQUITは、NEWされた変数を "アンスタック:unstacks" します、すなわち、スタックされた値に変数を復元します。現在の実行スコープがアクティブな時だけ、NEWが持続します。
NEWコマンドのフォーマットは:
N[EW][:tvexpr] [[(]lvn[,...][)][,...]]
オプションでコマンド直後に続く真理値の式は、GT.Mがコマンドを実行するかどうかをコントロールする後置コマンドです。
NEWの引数は、添字なしローカル変数の名前です; NEWは、引数で指定された変数だけに影響するだけでなく、すべての変数はその変数から降ります。
未定義の変数がNEWされる時、それが未定義であるという事実が "スタック" され、そして、現在のスコープを抜ける時、それが未定義であることを返します、すなわち、制御の移行中に変数が暗黙的にKILLされます。
引数なしの場合GT.Mは現在の既存のローカル変数のすべてをNEWします; この場合、行の中で次のコマンドと区別するために、NEWに続き少なくとも2つのスペースが必要です。
NEWのスコープについて、名前のNEWは、そのエイリアスの関連付けを中断します。NEWのスコープが終了する時、関連付けは復元されます。配列がそのまま存在し - それは関連付けられていてスコープ内に残っている他のエイリアス変数を介して変更することができます。もしそのエイリアス変数のいずれがスコープ内にない場合、スコープが復元される時に、配列は変更されないまま残り、再び見えるようになります。
NEWの引数が括弧で囲まれている場合は、そのNEWは "排他的" とみなされます。排他的NEWは、フレッシュなデータ環境を作成し、効果的にそれらオリジナルのコピーで除外される変数をエイリアスを作成します。この手法は、パフォーマンスを向上する傾向があり、M標準規格を満たしています。しかし、それには次の2つの意味があります: エイリアス操作KILL *は、引数なしで、または新しい変数の名前を独占的に指定すると、現在のスコープでKILLとして動作し(非エイリアスKILLと同じ効果があります)、ZWRITE、 ZSHOW "V"、$ZDATA() は、新しい変数を排他的にエイリアスとして報告します。KILLと排他的NEWの相互作用のための代替的な動作についての説明のKILLコマンドの項を参照してください。エイリアス変数の包括的な説明については、 “エイリアス変数の拡張” を参照してください。
実行フローは引数なし、または、排他的NEWのスコープを終了すると、GT.Mは、以前の値にすべてのスタック変数を復元し、そして、他のすべてのローカル変数を削除します。
固有の特殊変数 $ESTACK、$ETRAP、$ZGBLDIR、$ZYERROR は、NEWの明示的な引数になります。詳細は、 第8章: “組み込みの特殊変数”を参照してください。
特殊変数 $ZTRAPも、NEWの明示的な引数を指定できますが、これは現在の$ZTRAPの値をスタックし、$ZTRAPにnull 値を割り当てます($ZTRAP="")。
間接指定演算子と1つ以上のNEWの引数リストに評価される原子式(expression atom)は、NEWのための正当な引数を構成します。
NEWコマンドは、ローカル変数のスコープを限定するための手段を提供します。 NEWは、添字なしのローカル名だけで操作し、名付けられた配列全体上で動作します。
例:
NEW1; Set A(1)=1,B=4,C=5 Write !,"VARIABLES BEFORE NEW:",! ZWRite Do LABEL Write !,"VARIABLES AFTER RETURN:",! ZWRite Quit LABEL New A Set C=7 Write !,"VARIABLES AFTER NEW:",! ZWRite Quit
実行結果:
VARIABLES BEFORE NEW: A(1)=1 B=4 C=5 VARIABLES AFTER NEW: B=4 C=7 VARIABLES AFTER RETURN: A(1)=1 B=4 C=7
例:
NEW2; Set (A,B,C,D)="TEST" Do LABEL Write !,"VARIABLES AFTER RETURN:",! ZWRite Quit LABEL New (B,C) SET (A,B,Z)="NEW" Write !,"VARIABLES AFTER EXCLUSIVE NEW:",! ZWRite Quit
実行結果:
VARIABLES AFTER EXCLUSIVE NEW: A="NEW" B="NEW" C="TEST" Z="NEW" VARIABLES AFTER RETURN: A="TEST" B="NEW" C="TEST" D="TEST"
例:
/usr/lib/fis-gtm/V5.4-002B_x86/gtm -run ^stackalias stackalias ; Demonstrate New with alias ZPrint ; Print this program Set A=1,*B=A,*C(2)=A ; Create some aliases Write "------------",! Write "ZWRite in the caller before subprogram",! ZWRite Do S1 ; Call a subprogram Write "------------",! Write "ZWRite in the caller after subprogram - A association is restored",! ZWRite Quit ; S1 ; Subprogram New A Set A="I am not an alias",B="I am an alias" Write "------------",! Write "ZWRite in the subprogram with new A and modified B",! ZWRite Quit ------------ ZWRite in the caller before subprogram A=1 ;* *B=A C=3 *C(2)=A D=4 ------------ ZWRite in the subprogram with new A and modified B A="I am not an alias" B="I am an alias" ;* C=3 *C(2)=B D=4 ------------ ZWRite in the caller after subprogram - A association is restored A="I am an alias" ;* *B=A C=3 *C(2)=A D=4
以下は基本的に前の例と同じですが、排他的NEWを使用しています。
$ /usr/lib/fis-gtm/V5.4-002B_x86/gtm -run ^stackalias1 stackalias1 ; Demonstrate New with alias ZPrint ; Print this program Set A=1,*B=A,*C(2)=A ; Create some aliases Write "------------",! Write "ZWRite in the caller before subprogram",! ZWRite Do S1 ; Call a subprogram Write "------------",! Write "ZWRite in the caller after subprogram - A association is restored",! ZWRite Quit ; S1 ; Subprogram New (B) Set A="I am not an alias",B="I am an alias" Write "------------",! Write "ZWRite in the subprogram - Notice B is flagged as an alias",! ZWRite [参考] Quit ------------ ZWRite in the caller before subprogram A=1 ;* *B=A C=3 *C(2)=A D=4 ------------ ZWRite in the subprogram with new A and modified B A="I am not an alias" B="I am an alias" ;* C=3 *C(2)=B D=4 ------------ ZWRite in the caller after subprogram - A association is restored A="I am an alias" ;* *B=A C=3 *C(2)=A D=4
排他的なNEWは、名前または lvn と配列の両方の間の1つだけ関連が見ることができる中で、スコープを作成することができます。このケースでは、ZWRITEは、それにもかかわらず、その配列が1つだけの名前またはlvn からアクセス可能な場合であっても、エイリアスの存在を示しています。