ZSAVE
Synopsis
ZSAVE:pc routine ZS:pc routine
引数
pc | オプション — 後置条件式 |
routine | オプション — ルーチンの新しい名前。(有効な識別子である必要があります。) |
概要
ZSAVE は、現在のルーチンを保存します。ZLOAD を使用してルーチンをロードします。次に、ZSAVE を使用して、ZINSERT コマンドおよび ZREMOVE コマンドでルーチンに加えた変更を保存します。ZSAVE は、引数なしの ZLOAD でロードされるルーチン、または ZINSERT コマンドで作成される名前のないルーチンの命名にも使用されます。
ZSAVE で、編集ポインタをルーチンの末尾に移動します。実際には保存の必要がなかった場合でも、ZSAVE の発行により編集ポインタは移動します。
ZLOAD を使用してルーチンをロードし、そのルーチンに変更を加えずに、同じルーチン名で ZSAVE を使用して保存した場合、Caché はそのルーチンのタイムスタンプや生成されたフラグを更新しません。
ZSAVE は、ターミナル・プロンプトから使用するか、またはプログラム内で XECUTE コマンドによって呼び出すことで使用できます。
ZSAVE には、以下の 2 つの形式があります。
-
引数なし
-
引数付き
引数なしの ZSAVE は、現在のルーチンを、現在の名前 (つまり、ユーザが前回ルーチンを保存したときの名前) で現在のネームスペース内のディスクに保存します。現在のルーチンにまだ名前がない場合、引数なしの ZSAVE は <COMMAND> エラーを生成します。
ZSAVE routine は、現在のルーチンを、指定された routine 名で現在のネームスペース内のディスクに保存します。
XECUTE コマンドを使用して ZSAVE routine を呼び出す場合、システムは、Load フレームを作成して現在のルーチンを保持します。XECUTE コマンドが終了すると、Caché は、この Load フレームを使用して、現在のルーチンとして、XECUTE の前にルーチン名を リストアします。詳細は、以下の例を参照してください。
WRITE "Current routine name",!
WRITE "initial name: ",$ZNAME,!
SET x = "WRITE $ZNAME"
SET y = "ZSAVE mytest"
SET z = "WRITE "" changed to "",$ZNAME,!"
XECUTE x,y,z
WRITE "restored name: ",$ZNAME,!
引数
pc
オプションの後置条件式。Caché は、後置条件式が True (0 以外の数値に評価される) の場合にこのコマンドを実行します。Caché は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。
routine
ルーチンを保存する名前。routine は有効なルーチン名である必要があります。$ZNAME("string",1) 関数を使用すると、string が有効なルーチン名かどうかを判定できます。$ZNAME 特殊変数で、現在ロードされているルーチンの名前を判別できます。
通常、routine はルーチンの新しい名前ですが、現在のルーチン名にすることもできます。その名前によるルーチンが既に存在する場合、Caché はそれを上書きします。上書きするときに、Caché からの確認はないことに注意してください。ルーチン名の最初の 255 文字以内は一意である必要があります。220 文字を超える長さのルーチン名は避けてください。
ZSAVE routine を X で指定する場合、
routine を省略すると、システムは現在の名前でルーチンを保存します。現在の名前が存在しない場合、ZSAVE は <COMMAND> エラーを生成します。
例
以下のターミナル・セッションの例は、ZSAVE コマンドを実行して、現在ロードされているルーチンを保存します。
USER>DO ^myroutine
this is line 8
this is line 9
USER>ZLOAD myroutine
USER>PRINT +8
WRITE "this is line 8",!
USER>ZREMOVE +8
USER>PRINT +8
WRITE "this is line 9",!
USER>ZSAVE myroutine
USER>DO ^myroutine
this is line 9
USER>
メモ
ZSAVE 使用する場所
ZSAVE コマンドは、プログラマ・プロンプトで入力された場合と、ルーチンの XECUTE 文内でコード化された場合に限り機能します。このオペレーションはルーチンの実行に影響を与える可能性があるので、ルーチンの本体にコード化するべきではありません。ルーチン内ではあるが、XECUTE 文の外で ZSAVE をコーディングすると、その ZSAVE は現在のプログラムを保存します。
ZSAVE とルーチン・リコンパイル
ソース・コードを変更するコマンドを発行した場合、ZSAVE はルーチンをリコンパイルして保存します。ルーチンのソース・コードが無効な場合、ZSAVE は失敗して <NO SOURCE> エラーが発生し、既存のオブジェクト・コードを置換しません。例えば、次のコマンドは %SS オブジェクト・コード・ルーチンをロードして、(存在しない) ソース・コードから行を削除しようとし、その後 ^text グローバルに保存しようとします。この処理は失敗して、<NO SOURCE> エラーが発生します。
ZLOAD %SS ZREMOVE +3 ZSAVE ^test
ソース・コードを変更するコマンドを発行しない場合、ZSAVE は指定された routine にオブジェクト・コードを保存します(明らかにリコンパイルは発生しません)。例えば、次のコマンドは %SS オブジェクト・コード・ルーチンをロードして、^text グローバルに保存します。この処理は成功します。
ZLOAD %SS ZSAVE ^test
%Routine での ZSAVE
リモート・データセットに対する %routine に ZSAVE の実行を試みると、そのデータセットがプロセスの現在のデータセットであっても、<PROTECT> エラーが返されます。システム・ユーティリティのような変更不可のルーチンの名前には、その先頭にパーセント記号が使用されています。
並行 ZSAVE オペレーション
ネットワーク環境で ZSAVE を使用しているときは、2 つの異なるジョブがそれぞれのルーチンに同じ名前を割り当てて同時に保存する可能性があります。このオペレーションでは、一方のルーチンが他方を上書きし、予測できない結果を生じる可能性があります。こうした可能性がある場合は、ZSAVE オペレーションの前にルーチンに対して通知ロックを取得します。例えば、LOCK ^ROUTINE("name") を使用します。詳細は、"LOCK" コマンドを参照してください。ECP 経由でジョブを実行しているとき、ローカル・バッファの保護が他のクライアントには認識されないため、保存されたソースはこうした同時保存による障害を受けやすい状態になります。