MERGEコマンドは、別の変数へ、変数とそのすべての下位ノードをコピーします。 MERGEは、転送先の変数を削除しませんし、またその下位ノードも削除しません。
MERGEコマンドのフォーマットは:
M[ERGE][:tvexpr] glvn1=glvn2[,...]
オプションでコマンド直後に続く真理値の式は、GT.Mがコマンドを実行するかどうかをコントロールする後置コマンドです。
glvn1 と glvn2 との両方がローカル変数である場合、ネイキッドインジケータは変更されません。
もし glvn2 がグローバル変数で glvn1 がローカル変数ならば、ネイキッドインジケータは glvn2 を参照します。
もし glvn2 が未定義($DATA(glvn2)=0)の場合、両方がグローバル変数である時、ネイキッドインジケータの状態は変更されません。
$DATA(glvn2)=10を含む他のすべてのケースでは、もしSETコマンドがMERGEコマンドに置き換わっていていて glvn2 が値を持っていた場合、ネイキッドインジケータは、それが持っている同じ値を取ります。
もし glvn1 が glvn2 の下位ノードである場合、または、glvn2 が glvn1 の下位ノードである場合、GT.Mはエラーを生成します。
$data(glvn2) が0の場合、コマンドはNOOPであり、GT.Mはエラーを出力しません。
間接指定演算子と1つ以上のMERGEの引数リストに評価される原子式(expression atom)は、MERGEのための正当な引数を構成します。
注意 | |
---|---|
GT.Mは、エラーのように標準で記述されている特定のシンタックスやアクションを許可することがあります。たとえば、ソースとディストネーションの位置で操作を指定するMERGEコマンドは重複します、しかし$DATA(source)=0 はエラーを生成しません(無操作に相当)。 |
MERGEでは、別のローカルまたはグローバル変数へ、ローカルまたはグローバル変数のサブツリーのコピーが簡単にできます。サブツリーは、指定された変数の下位ノードであるすべてのグローバルまたはローカル変数です。 MERGEは、サブツリーのコピーを行うため$ORDER()または$QUERY()の参照を、一連のSETコマンドを使用へのワンコマンド代替テクニックを提供しています。
例:
GTM>Set ^gbl1="one" GTM>Set ^gbl1(1,1)="oneone" GTM>Set ^gbl1(1,1,3)="oneonethree" GTM>Set ^gbl1(1,2,4)="onetwofour" GTM>Set ^gbl2(2)="gbl2_2" GTM>Set ^gbl2(2,1,3)="gbl2_2_1_3" GTM>Set ^gbl2(2,1,4,5)="gbl2_2_1_4_5" GTM>Merge ^gbl1(1)=^gbl2(2) GTM>WRITE $Reference ^gbl1(1) GTM>ZWRite ^gbl1 ^gbl1="one" ^gbl1(1)="gbl2_2" ^gbl1(1,1)="oneone" ^gbl1(1,1,3)="gbl2_2_1_3" ^gbl1(1,1,4,5)="gbl2_2_1_4_5" ^gbl1(1,2,4)="onetwofour" GTM>ZWRITE ^gbl2 ^gbl2(2)="gbl2_2" ^gbl2(2,1,3)="gbl2_2_1_3" ^gbl2(2,1,4,5)="gbl2_2_1_4_5" GTM>
この例では、MERGEは別に1つのグローバルのサブツリーをコピーする方法を示しています。$DATA()の値が1または11となっている ^gbl(2) のサブツリーの内のノードは、次のように ^gbl1(1) のサブツリーにコピーされます。
^gbl1(1) is updated from the value of ^gbl2(2) ^gbl1(1,1,3) is updated from the value of ^gbl2(2,1,3) ^gbl1(1,1,4,5) is updated from the value of ^gbl2(2,1,4,5)
^gbl1(2,1) と ^gbl2(2,2,4) は値を持っていないので($DATA()=0)、対応するノード ^gbl1(1,1) と ^gbl(1,2,4) のそれぞれ変更されません。あたかもSETがMERGEに置き換わったように、ネイキッドインジケータは 値 ^gbl(1) をとります。 MERGEコマンドでは ^gbl2(2) または その下位ノードが変更されないことに注意してください。 ^gbl(1)の上位ノードにも変更されません。
例:
GTM>Kill GTM>Set ^gbl(1,2)="1,2" GTM>Merge lcl(3,4)=^gbl(1) GTM>Set ^("naked")=2 GTM>ZWRite ^gbl ^gbl(1,2)="1,2" ^gbl("naked")=2 GTM>ZWRite lcl lcl(3,4,2)="1,2" GTM>
この例では、MERGEは、変数が存在しない時に、変数のサブツリーを作成する方法を示しています。また、MERGEのソースがグローバルと転送先ローカルの場合に、ネイキッドインジケータがセットされている方法がわかります。