ZINSERT (ObjectScript)
構文
ZINSERT:pc "code":location ,...
ZI:pc "code":location ,...
引数
引数 | 説明 |
---|---|
pc | オプション — 後置条件式。 |
code | ObjectScript コードの行。(引用符で囲まれた) 文字列リテラル、または文字列リテラルを含む変数として指定されます。実行可能なコードの場合、最初の文字はスペースである必要があります。スペースで始まらない行は、ラベル名として扱われます。コード行には、ラベル名と、それに続いて実行可能なコードを含めることができます。 |
:location | オプション — ZINSERT がコードを挿入する前の行。ラベル名、数値オフセット (+n)、またはラベル名と数値オフセットのいずれかになります。location を省略すると、code は現在の行位置 (編集ポインタ) に挿入されます。 |
概要
このコマンドにより、ObjectScript のソース・コードの行が現在ロードされているルーチンに挿入され、編集ポインタが挿入行の直後に進みます。ObjectScript ソース・コードの複数の行を、コンマで区切った一連の code:location 引数として挿入できます。コード行は、指定した順序で別個の挿入操作として挿入されます。
ルーチンをロードするには、ターミナルから ZLOAD を使用します。ZLOAD は、ルーチンの INT コード・バージョンをロードします。INT コードではプリプロセッサ文はカウントされず、含まれることもありません。INT コードでは、ルーチンの MAC バージョンの完全な空白行はカウントされず、含まれることもありません。これは、ソース・コード内であっても、複数行コメント内であっても同じです。ルーチンがロードされると、そのルーチンは、すべてのネームスペースで、現在のプロセスに対して現在ロードされているルーチンになります。したがって、ルーチンのロード元のネームスペースだけではなく任意のネームスペースから、現在ロードされているルーチンの行の挿入または削除、ルーチンの表示、実行、アンロードを実行できます。
ターミナルから入力したり、XECUTE コマンドまたは $XECUTE 関数で呼び出したりする場合は、ZINSERT コマンドのみ使用できます。ルーチンの本文で ZINSERT を指定すると、コンパイル・エラーが返されます。また、ルーチン内から ZINSERT を実行しようとしても、エラーが生成されます。
-
ZINSERT "code" は、指定された ObjectScript コード行を、現在のルーチンで現在の編集ポインタの位置に挿入します。
-
ZINSERT"code":location は、指定されたコード行を現在のルーチンの指定された行 location の後に挿入します。行位置は、ルーチンの開始からの行オフセット番号、ラベル、または指定されたラベルの行オフセット番号として指定できます。
ZINSERT がコード行を挿入した後、この新規のコード行の最後に編集ポインタを再設定します。これは、次の ZINSERT (またはコンマで区切られた一連の ZINSERT の引数に含まれる次のコード行) で明示的に location が指定されていなければ、次の ZINSERT は最後に挿入された行の直後にコード行を配置することを意味しています。
ZINSERT は、行ごとに増分コンパイルを実行します。DO コマンドを使用して、現在のルーチンを実行できます。
ZINSERT は、現在のルーチンのローカル・コピーにのみ影響します。ディスク上に保存されているルーチンは変更されません。挿入された行を保存するには、ZSAVE コマンドを使用して、現在のルーチンを保存する必要があります。
$ZNAME 特殊変数で、現在のルーチンの名前を判別できます。ZPRINT を使用して、現在ロードされているルーチンの複数の行を表示できます。
編集ポインタ
ZINSERT で編集ポインタを動かします。
編集ポインタは次のように設定します。
-
ZLOAD で、編集ポインタをルーチンの先頭に設定します。
-
ZINSERT で、編集ポインタを、挿入する行の直後に設定します。例えば、ZINSERT " SET x=1":+4 の次に ZINSERT " SET y=2" を指定すると、第 5 行および第 6 行が挿入されます。
-
ZREMOVE で、編集ポインタを、削除する行に設定します。例えば、ZREMOVE +4 の次に ZINSERT " SET y=2" を指定すると、第 4 行が削除され、第 4 行は挿入した行で置き換わります。
-
ZPRINT (または PRINT) で、編集ポインタを、出力した行の末尾に設定します。例えば、ZPRINT の次に ZINSERT " SET y=2" を指定すると、行がルーチンの末尾に挿入されます。また、ZPRINT +1:+4 の次に ZINSERT " SET y=2" を指定すると、行が第 5 行として挿入されます。$TEXT 関数は、現在のルーチンから 1 行を出力しますが、編集ポインタは変更しません。
-
ZSAVE では、編集ポインタは変更されません。
-
DO では、編集ポインタは変更されません。
引数
pc
オプションの後置条件式。InterSystems IRIS は、後置条件式が True (0 以外の数値に評価される) の場合にコマンドを実行します。InterSystems IRIS は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"コマンド後置条件式" を参照してください。
code
ObjectScript コードの行。(引用符で囲まれた) 文字列リテラル、または文字列リテラルを含む変数として指定されます。このコード行には、1 つ以上の ObjectScript コマンド、新規のラベル名、またはラベルと 1 つ以上のコマンドの両方を含めることができます。コードはルーチンに挿入されるので、形式は ObjectScript に従う必要があります。したがって、code 文字列リテラルの最初の文字は空白スペース (標準 ObjectScript インデント)、またはラベルのいずれかでなければなりません。また、引用符で囲む必要もあります。引用符は挿入しているコード行を囲むので、コード内の引用符は二重になります。
%Library.RoutineOpens in a new tab クラスの CheckSyntax()Opens in a new tab メソッドを使用すると、code の行を挿入する前に、その行の構文チェックを実行できます。CheckSyntax() と ZINSERT の両方で、実行可能な ObjectScript コード行の前には 1 つ以上のスペースが必要です。また、インデントされていない行は、ラベル、またはラベルとそれに続く実行可能なコードとして解析されます。CheckSyntax() も ZINSERT もマクロ・プリプロセッサ・コードは解析しません。
location
ZINSERT がコードを挿入する前の行。以下の形式のうちのいずれかをとることができます。
形式 | 説明 |
---|---|
+offset | ルーチン先頭からのオフセット行数として、行の位置を特定する正の整数に評価される式。ZINSERT は、コード行を指定した行の直後に挿入します。ルーチンの先頭に行を挿入するには、+0 を指定します。このプラス符号は必須です。+offset を省略した場合、label で特定される行が検索されます。 |
label | 現在のルーチン内の既存の行ラベル。リテラル値である必要があります。変数は、label の指定には使用できません。行ラベルでは、大文字と小文字が区別されます。省略した場合、+offset はルーチンの先頭からカウントされます。 |
label+offset | ラベルと、ラベルが付けられたセクション内の行のカウント・オフセットを指定します。+offset の値を省略、または label+0 を指定すると、InterSystems IRIS はラベル行を検索して、その直後に挿入します。 |
ZINSERT は現在のルーチン専用です。その位置に label^routine を指定しようとすると、<SYNTAX> エラーが返されます。
コード行は番号 1 から開始されるので、+1 の位置を指定すると、ルーチンの最初の行の後にコード行が挿入されます。ルーチンの最初、またはラベル付けされたセクションの最初 (既存の最初の行の前) に行を挿入するときは、+0 のオフセットを使用します。例えば、以下のようになります。
ZINSERT "Altstart SET c=12,d=8":+0
上記の例では、ルーチンの最初にコード行を挿入します。+0 のオフセットを使用することで (または location を省略することで)、別の空の現在ルーチンに行を挿入できます。
^ROUTINE グローバルを使用して、INT ルーチンの行番号を返すことができます。^ROUTINE は、ディスクに保存されている INT ルーチンのバージョンを返します。そのため、現在のルーチンを変更しても、保存していなければ変更内容が返されないことに注意してください。^ROUTINE では、編集ポインタは変更されません。
ラベルは、31 文字よりも長くすることができますが、最初の 31 文字は一意である必要があります。ZINSERT は、指定された label の最初の 31 文字のみと一致します。ラベル名では大文字と小文字が区別され、Unicode 文字を含めることができます。
INT コード行には、すべてのラベル、コメント、および空白が含まれます。例外として、コンパイラによって削除される、MAC ルーチンのすべて空白の行は表示もカウントもされません。複数行コメント内の空白行も削除されます。MAC コード内のコメント #;、##;、および /// は、INT コードには表示されないことがあるため、行数やオフセットに影響が生じる場合があります。詳細は、"MAC コードのルーチンおよびメソッドに使用するコメント" を参照してください。
ZINSERT と ZREMOVE
ZREMOVE コマンドを使用して、現在実行中のルーチンから 1 行、または複数のコード行を削除することができます。したがって ZREMOVE と ZINSERT を使用して、既存のコード行と新規の行を置換することができます。このような操作は、プロセスで現在実行されているルーチンのコピーにのみ影響を与えます。
ZINSERT は、指定された location の後に行を挿入します。ZREMOVE は、指定された位置で行を削除します。例えば、ZINSERT " SET x=1":+4 で行を挿入する場合、この行を削除するには、ZREMOVE +5 を指定する必要があります。
ZINSERT、XECUTE、および $TEXT
XECUTE コマンドは、ルーチンから実行可能なコードの単独の行を定義し、挿入するために使用されます。ZINSERT コマンドを使用して、ルーチンの外部から、実行可能なコードの単独の行を行位置ごとに定義し、挿入することができます。
XECUTE コマンドは、新規のラベルの定義に使用することはできません。したがって、XECUTE はコード行の最初のコマンドの前に、最初の空白スペースを必要としません。ZINSERT コマンドは、新規のラベルの定義に使用できます。したがって、ZINSERT はコマンド行の最初のコマンドの前に、最初の空白スペース (または新規ラベルの名前) を必要とします。
$TEXT 関数を使用して、ルーチンから行位置によりコード行を抽出することができます。$TEXT はテキスト文字列として指定されたコード行をコピーします。これによってその行の実行に影響が及んだり、現在のルーチンからの抽出時に現在の行位置 (編集ポインタ) が変更されることはありません。($TEXT を使用して現在のルーチン以外のルーチンからコードを抽出すると、現在の行位置が変更されます)。$TEXT は、XECUTE コマンドにコード行を提供できます。$TEXT は WRITE コマンドにコード行を提供することもできるので、ターミナルにコード行を提供します。
XECUTE コマンドは、ルーチンから実行可能なコードの単独の行を定義し、挿入するために使用されます。ZINSERT コマンドを使用して、ルーチンの外部から、実行可能なコードの単独の行を行位置ごとに定義し、挿入することができます。
ZINSERT を使用したルーチンの作成
現在のルーチンがない場合、ZINSERT を使用して、名前のないルーチンを現在のルーチンとして作成できます。
-
ターミナル・プロンプトで、ObjectScript コードの最初の行を指定して ZINSERT コマンドを発行します。通常、この行は、ラベル名、またはラベル名とそれに続く実行可能な ObjectScript コードのいずれかです。この最初の行にラベル名が含まれている場合は、DO を使用して、このルーチンを保存することなく実行できます。ラベル名が含まれていない場合、このコードを実行するには、ZSAVE routine を使用して、このルーチンに名前を付けて保存する必要があります。
-
ターミナル・プロンプトで、追加の ZINSERT コマンドを発行して、現在のルーチンに行を追加します。
-
ルーチンを保存する場合は、ターミナル・プロンプトで ZSAVE routine を発行し、指定した名前でこのルーチンを保存します。
-
完了したら、引数なしの ZREMOVE を使用して、現在のルーチンをアンロードします。
Tab キーの省略表現を使用したルーチンの作成
現在のルーチンがない場合、ターミナルでは Tab キーを使用するルーチンを作成するための省略表現も認識されます。1 行目 (下記参照) を除き、Tab キーは事実上 ZINSERT コマンドの代替として機能します。
-
ターミナル・プロンプトで、目的のルーチン (routine) の名前を指定して Tab キーを押し、ルーチンの 1 行目を入力します。
-
現在のルーチンに追加する行ごとに、Tab に続いてターミナル・プロンプトで行の内容を入力します。
-
Enter キーを押して、この入力を完了します。
-
ルーチンを実行するには、DO コマンドを呼び出して、引数としてルーチン名を渡します (ただし、ルーチン名の先頭にはキャレットを含めないでください。この後の例を参照してください)。
-
実行が完了すると、routine を引数として指定しているかどうかに関係なく、ZREMOVE が起動して現在のルーチンがアンロードされます。
例えば、以下の一連のコマンドによって、1 から 10 までの番号を書き込む簡単なルーチン counter が作成され、呼び出されます。
USER>counter Tab for i=1:1:10 { USER>Tab write i,! USER>Tab } USER>DO counter
この省略表現を使用しても ZPRINT は正常に動作します。ZLOAD コマンドと ZINSERT コマンドを明示的に使用して作成したルーチンと異なり、ZSAVE を使用した場合はルーチンの名前を指定できません。
例
以下の例では、現在のルーチンの 4 番目の行の後にコード行 SET x=24 が挿入されます。挿入されたこのコード行はラベルで開始されていないため、最初のスペースは必要な行開始文字として含まれる必要があります。
ZINSERT " SET x=24":+4
以下の例では、3 つのコード行が挿入されます。現在のルーチンの 4 番目の行の後に SET x=24 が挿入されます。続いて、2 番目のコード行で location が指定されていないため、編集ポインタの現在の位置 (SET x=24 の直後) に SET z=1 が挿入されます。その後、新しい行位置 +5 (SET x=24 と SET z=1 の間) に、SET y=1 が設定されます。
ZINSERT " SET x=24":+4," SET z=1"," SET y=1":+5
以下の例では、現在ロードされているルーチンに、"Checktest" と呼ばれるラベルが含まれていると仮定します。ZINSERT コマンドは、Checktest 内の 6 番目の行の後に新しい行を挿入します (Checktest+6)。新規の行には、"Altcheck" というラベルと SET y=0 というコマンドが含まれます。
ZINSERT "Altcheck SET y=0":Checktest+6
挿入されたコード行はラベル "Altcheck" で開始するので、引用符の後に最初のスペースは必要ないことに注意してください。
以下の例では、現在のルーチンの 4 行目の後にコード行 SET x=24 WRITE !,"x is set to ",x が挿入されます。挿入されたコード行は引用符で囲まれるので、WRITE コマンド内の引用符は二重になります。
ZINSERT " SET x=24 WRITE !,""x is set to "",x":+4