ZLOAD (ObjectScript)
構文
ZLOAD:pc routine
ZL:pc routine
引数
引数 | 説明 |
---|---|
pc | オプション — 後置条件式。 |
routine | オプション — ロードするルーチン。単純なリテラルとして指定します。routine の値は括弧で囲みません。キャレット (^) 接頭語やファイル・タイプ接頭語は付きません。変数または式を使用して指定することはできません。省略した場合、InterSystems IRIS は現在のデバイスから名前のないルーチンをロードします。 |
概要
ZLOAD コマンドは、ObjectScript ルーチンの INT コード・バージョンを現在のルーチンとしてロードします。ZLOAD には、以下の 2 つの形式があります。
ターミナルから入力したり、XECUTE コマンドまたは $XECUTE 関数で呼び出したりする場合は、ZLOAD コマンドのみ使用できます。このオペレーションはルーチンの実行に影響を与える可能性があるので、ルーチンの本体にコード化するべきではありません。ルーチン内で ZLOAD を指定すると、コンパイル・エラーが返されます。また、ルーチンから ZLOAD を実行しようとしても、エラーが生成されます。
ZLOAD を使用してルーチンを現在のルーチンとしてロードした後、DO コマンドを使用して現在のルーチンを実行できます。続いて、ZINSERT や 引数付きの ZREMOVE を使用して現在のルーチンを編集し、ZPRINT でルーチン行を表示できます。さらに、ZSAVE を使用して、編集した現在のルーチンを保存 (オプションで名前を変更) して、最後に引数なしの ZREMOVE を使用して現在のルーチンをアンロードすることができます。
引数なしの ZLOAD
引数なしの ZLOAD コマンドは、名前のない ObjectScript ルーチンを、現在のプロセスを対象に現在のルーチンとしてルーチン・バッファにロードします。その後、ZSAVE routine を使用して、このルーチンに名前を付けることができます。このルーチンには名前が付いていないため、$ZNAME 特殊変数を使用して、現在のルーチンがロードされているかどうかを判断することはできません。
引数なしの ZLOAD には以下の 2 つの使用方法があります。
-
シーケンシャル・ファイルまたは他のデバイスからルーチンをロードする
-
ターミナルを使用してルーチンを作成する
引数なしの ZLOAD コマンドでは後置条件式を指定することができます。
デバイスからのルーチンのロード
デバイスからルーチンをロードするには、以下を実行します。
-
OPEN コマンドを発行してデバイスを開きます。
-
USE コマンドを発行して、デバイスを現在のデバイスにします。
-
引数なしの ZLOAD コマンドを発行して、デバイスからルーチンを現在のルーチンとしてロードします。
InterSystems IRIS が NULL 文字列行 ("") を読み取るまで、行のロードを継続します。ロードされたこのルーチンは、ZSAVE routine コマンドで保存するまで名前がありません。
ターミナルからのルーチンの作成
ターミナルから、引数なしの ZLOAD を使用して、名前のないルーチンを現在のルーチンとして作成します。
-
ターミナル・プロンプトで、引数なしの ZLOAD コマンドを発行します。
-
次の行に、ルーチンの最初の ObjectScript コマンドを (括弧で囲まずに) 入力して、Enter キーを 2 回押します。通常、この行は、ラベル名、またはラベル名とそれに続く実行可能な ObjectScript コードです。実行可能な ObjectScript コードはインデントする必要があります。
-
ターミナル・プロンプトで、ZINSERT コマンドを発行して、この現在のルーチンに他の行を追加します。
-
オプションで、ターミナル・プロンプトで、ZSAVE routine を発行し、指定した名前でこのルーチンを保存します。
-
完了したら、引数なしの ZREMOVE を使用して、現在のルーチンをアンロードします。
または、ターミナルから、ZINSERT を使用して、名前のないルーチンを現在のルーチンとして作成することができます。ターミナルでは Tab キーを使用するネームド・ルーチンを作成するための省略表現も認識されます。
引数付きの ZLOAD
ZLOAD routine は、既存の ObjectScript ルーチンの INT コード・バージョンを、現在のプロセスの現在のルーチンとして、現在のネームスペースからルーチン・バッファにロードします。INT コードではプリプロセッサ文はカウントされず、含まれることもありません。
ZLOAD は、ルーチンをロードするときに暗黙的に引数なしの ZREMOVE を実行します。つまり、ZLOAD は、以前ロードされたすべてのルーチンを削除し、指定された routine に置き換えます。$ZNAME 特殊変数で、現在ロードされているルーチンを判別できます。ルーチンをロードすると、ZLOAD は、ルーチンの先頭で行ポインタを配置します。
一度ロードされると、ユーザが別のルーチンを ZLOAD コマンドで明示的にロードするか、引数なしの ZREMOVE で削除するか、または DO コマンドや GOTO コマンドで別のルーチンを暗黙的にロードするまで、ルーチンはプロセスの現在のルーチンのままです。
ルーチンが現在のものである限り、(ZINSERT および ZREMOVE コマンドで) ルーチンを編集し、ZPRINT コマンドで行を 1 行以上表示したり、$TEXT 関数で単一行を返すことができます。
引数
pc
オプションの後置条件式。InterSystems IRIS は、後置条件式が True (0 以外の数値に評価される) の場合にコマンドを実行します。InterSystems IRIS は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。 For further details, refer to Command Postconditional Expressions.
routine
現在のルーチンとしてロードする、現在のネームスペース内の既存の ObjectScript ルーチン。ルーチン名は、大文字と小文字を区別します。
ZLOAD を可能にするために routine への実行許可を持つ必要があります。この許可がない場合は、InterSystems IRIS は <PROTECT> エラーを生成します。
指定されたルーチンが存在しない場合、システムは <NOROUTINE> エラーを生成します。ZLOAD でルーチンをロードしようとして失敗した場合、現在ロードされているルーチンは削除されることに注意してください。
その後、このプロセスでエラーが発生すると、そのすべてに、現在ロードされているルーチンの名前が付加されます。これは、エラーがルーチンと関係があるかどうかにかかわらずネームスペース全体にわたって実行されます。詳細は、"$ZERROR" 特殊変数を参照してください。
ネームスペース
ZLOAD でロードできるルーチンは、現在のネームスペースに存在するルーチンだけです。ルーチンがロードされると、そのルーチンは、すべてのネームスペースで、このプロセスに対して現在ロードされているルーチンになります。したがって、ルーチンのロード元のネームスペースだけではなく任意のネームスペースから、現在ロードされているルーチンの行の挿入または削除、ルーチンの表示、実行、アンロードを実行できます。ZSAVE は、現在ロードされているルーチンを現在のネームスペースに保存します。したがって、ZLOAD のネームスペースが ZSAVE のネームスペースと異なる場合、ルーチンの変更されたバージョンは、ZSAVE を発行したときに現在のネームスペースであるネームスペースに保存されます。変更は、ZLOAD ネームスペース内のルーチンのバージョンでは保存されません。
ZLOAD でのルーチンの振る舞い
ZLOAD routine を指定する場合、InterSystems IRIS はメモリ内のルーチン・バッファのプールのルーチンを検索します。ルーチンがない場合、InterSystems IRIS はルーチンの ObjectScript オブジェクト・コード・バージョンをバッファの 1 つにロードします。ObjectScript INT (中間) コードは、現在のネームスペースの対応する ^ROUTINE グローバルに残りますが、編集を行って、ZSAVE を使用して変更を保存した場合には更新されます。
例えば、ZLOAD MyTest は (まだロードされていない場合に) ルーチン MyTest のオブジェクト・コード・バージョンをロードします。MyTest ルーチンは、現在のネームスペースに存在している必要があります。
マルチユーザ環境では、LOCK プロトコルを設定し、複数のユーザが同時に同じルーチンをロードして変更するのを防ぐ必要があります。各ユーザは、対応するルーチンに対して ZLOAD を発行する前に、排他ロックを取得する必要があります。
routine を省略した場合、ZLOAD は、NULL 行を入力する (つまり、Return (Enter キー) を押す) ことでコードを終了するまで、現在のデバイス (通常はキーボード) から入力した新しいコード行をロードします。このルーチンは、次の ZSAVE コマンドで保存するまで名前がありません。
^rINDEX ルーチンのタイムスタンプとサイズ
以下のターミナルの例に示すように、^rINDEX グローバルを使用して、ルーチンの MAC、INT、および OBJ の各コード・バージョンのローカル・タイムスタンプと文字数を返すことができます。
USER>ZWRITE ^rINDEX("MyTest")
^rINDEX("MyTest","INT")=$lb("2019-12-13 06:37:49",475)
^rINDEX("MyTest","MAC")=$lb("2019-12-13 06:34:04.235011",452)
^rINDEX("MyTest","OBJ")=$lb("2019-12-13 06:37:49",476)
USER>
MAC のタイムスタンプは、MAC コードの変更後の最終保存日時です。INT と OBJ のタイムスタンプは、MAC コードの最終コンパイル日時です。INT コード・バージョンの変更後に ZSAVE を発行すると、INT および OBJ のタイムスタンプと文字数が更新されます。INT コードを変更せずに ZSAVE を発行すると、OBJ のタイムスタンプのみが更新されます。
INT コードと ^ROUTINE グローバル
ルーチンの ObjectScript INT (中間) コードは、^ROUTINE グローバルに格納されます。^ROUTINE は、現在のネームスペースのルーチンにのみアクセスできます。^ROUTINE で表示されるのは、ディスク上にあるルーチンの INT コード・バージョンであり、現在ロードされているルーチンではありません。
-
ZWRITE コマンドを使用すると、指定したルーチンの INT コードを表示できます。
ZWRITE ^ROUTINE("MyRoutine")
この表示には、ルーチン MyRoutine の以下の ^ROUTINE 添え字が含まれます。
-
^ROUTINE("MyRoutine",0)="65309,36923.81262":このルーチンの INT コード・バージョンが最後にコンパイルされたローカル日時 ($HOROLOG 形式)。このタイムスタンプは、再コンパイル前に MAC コードを変更していなくても更新されます。指定したルーチンが現在ロードされているルーチンである場合、現在ロードされているルーチンが変更されていれば、ZSAVE を発行すると、この値が更新されます。
-
^ROUTINE("MyRoutine",0,0)=8:このルーチンの INT コード・バージョンの行数。
-
^ROUTINE("MyRoutine",0,1)="Main":このルーチンの INT コード・バージョンの最初の行。この場合は、ラベル Main になります。
-
^ROUTINE("MyRoutine",0,2)=" WRITE ""This is line 2"",!":このルーチンの INT コード・バージョンの 2 行目。この場合は、インデントされた実行可能な ObjectScript コード行になります。追加のコード行も同じパターンに従います。
ZINSERT および ZREMOVE で現在のルーチンを変更した場合、ZSAVE を使用して変更を保存しない限り、^ROUTINE には反映されません。
ルーチンが MAC コード・ソースからロードされている場合、^ROUTINE の以下の添え字も表示されます。
-
^ROUTINE("MyRoutine","GENERATED")=1:INT コードが生成されたことを示します。
-
^ROUTINE("MyRoutine","INC","%occStatus")="65301,60553" : MAC バージョンに複数の #include ファイルが含まれる場合は、各 #include ファイルに対してこれらの添え字の 1 つが含まれ、#include ファイルが作成されたときのタイムスタンプを示します。
-
^ROUTINE("MyRoutine","SIZE")=134:ソース・ファイルの INT コード・バージョンの文字数。
-
^ROUTINE("MyRoutine","MAC")="65309,36920.45721":ルーチンの MAC バージョンが最後に保存されたローカル日時 ($HOROLOG 形式)。このタイムスタンプは、MAC コードを変更して保存し、再コンパイルした場合にのみ更新されます。
-
-
管理ポータルを使用して、^ROUTINE グローバルの内容を表示し、編集することができます。[システムエクスプローラ] > [グローバル] を選択し、左側の列のネームスペースのドロップダウン・リストから目的のネームスペースを選択します。
-
KILL コマンドを使用して、ObjectScript INT (中間) コードを削除できます。
KILL ^ROUTINE("MyRoutine")
ルーチンの INT コードが利用できない場合 (KILL で削除されている場合)、ルーチンは引き続き実行できますが、現在ロードされているルーチンで INT コードを変更することはできません。ZLOAD、ZINSERT、および ZREMOVE ではエラーは発行されませんが、ZSAVE は <NO SOURCE> エラーで失敗します。
ZLOAD と言語モード
ルーチンがロードされるとき、現在の言語モードはロードされたルーチンの言語モードに変換されます。呼び出されたルーチンの終了時、言語モードは呼び出し元のルーチンの言語モードに復元されます。しかし、ZLOAD でロードされたルーチンの終了時、言語モードは前の言語モードに復元されません。 For further details on checking and setting language modes, refer to the LanguageMode()Opens in a new tab method of the %SYSTEM.ProcessOpens in a new tab class.
例
以下のターミナルの例では、排他ロックを確立してから、対応するルーチン MyRoutine をロードします。ソース・コードの最初の 10 行を表示して、ObjectScript コードの 1 行を行 2 として追加し、ソース・コードを再表示してから、変更を保存してロックを解放します。
USER>LOCK +^ROUTINE("MyRoutine")
USER>ZLOAD MyRoutine
USER>ZPRINT +1:+10
USER>ZINSERT " WRITE ""Hello, World!""":+1
USER>ZPRINT +1:+11
USER>ZSAVE
USER>LOCK -^ROUTINE("MyRoutine")
以下のターミナルの例では、デバイス dev から最初のルーチンをロードします。
USER>OPEN dev
USER>USE dev
USER>ZLOAD