ZINSERT
Synopsis
ZINSERT:pc "code":location ZI:pc "code":location
引数
pc | オプション — 後置条件式。 |
code | ObjectScript コードの行。(引用符で囲まれた) 文字列リテラル、または文字列リテラルを含む変数として指定されます。最初の文字は必ず、スペース、もしくはラベル名のいずれかにします。 |
location | オプション — ZINSERT がコードを挿入する前の行。ラベル名、数値オフセット (+n)、またはラベル名と数値オフセットのいずれかになります。location を省略すると、code は現在の行位置 (編集ポインタ) に挿入されます。 |
概要
このコマンドにより、ObjectScript のソース・コードの行が現在のルーチンに挿入され、編集ポインタが挿入行の直後に進みます。
ZINSERT "code" は、指定された ObjectScript コード行を、現在のルーチンで現在の編集ポインタの位置に挿入します。
ZINSERT"code":location は、指定されたコード行を現在のルーチンの指定された行 location の後に挿入します。行位置は、ルーチンの開始からの行オフセット番号、ラベル、または指定されたラベルの行オフセット番号として指定できます。
ZINSERT がコード行を挿入した後、この新規のコード行の最後に編集ポインタを再設定します。これは、次の ZINSERT で明示的に location が指定されていなければ、次の ZINSERT は最後に挿入された行の後にコード行を直接配置することを意味しています。
ZINSERT は、ルーチンのローカル・コピーにのみ影響します。ディスク上に保存されているルーチンは変更されません。挿入された行を保存するには、ZSAVE コマンドを使用して、そのルーチンを保存する必要があります。ZINSERT は、行ごとに増分コンパイルを実行します。
ZINSERT コマンドは通常、プログラマ・プロンプトから実行されます。このオペレーションはルーチンの実行に影響を与える可能性があるので、ルーチンの本体にコード化するべきではありません。ルーチンから ZINSERT を呼び出すには、XECUTE コマンドを使用します。
$ZNAME 特殊変数で、現在のルーチンの名前を判別できます。
編集ポインタ
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 行として挿入されます。
-
ZSAVE で、編集ポインタをルーチンの末尾に設定します。例えば、ZSAVE myroutine の次に ZINSERT " SET y=2" を指定すると、行がルーチンの末尾に挿入されます。
引数
pc
オプションの後置条件式。Caché は、後置条件式が True (0 以外の数値に評価される) の場合にこのコマンドを実行します。Caché は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。
code
ObjectScript コードの行。(引用符で囲まれた) 文字列リテラル、または文字列リテラルを含む変数として指定されます。このコード行には、1 つ以上の ObjectScript コマンド、新規のラベル名、またはラベルと 1 つ以上のコマンドの両方を含めることができます。コードはルーチンに挿入されるので、形式は ObjectScript に従う必要があります。したがって、code 文字列リテラルの最初の文字は空白スペース (標準 ObjectScript インデント)、またはラベルのいずれかでなければなりません。また、引用符で囲む必要もあります。引用符は挿入しているコード行を囲むので、コード内の引用符は二重になります。
location
ZINSERT がコードを挿入する前の行。以下の形式のうちのいずれかをとることができます。
+offset | ルーチン先頭からのオフセット行数として、行の位置を特定する正の整数に評価される式。ZINSERT は、コード行を指定した行の直後に挿入します。ルーチンの先頭に行を挿入するには、+0 を指定します。このプラス符号は必須です。+offset を省略した場合、label で特定される行が検索されます。 |
label | 現在のルーチン内の既存の行ラベル。リテラル値である必要があります。変数は、label の指定には使用できません。行ラベルでは、大文字と小文字が区別されます。省略した場合、+offset はルーチンの先頭からカウントされます。 |
label+offset | ラベルと、ラベルが付けられたセクション内の行のカウント・オフセットを指定します。+offset の値を省略、または label+0 を指定すると、Caché はラベル行を検索して、その直後に挿入します。 |
ZINSERT は現在のルーチン専用です。その位置に label^routine を指定しようとすると、<SYNTAX> エラーが返されます。
コード行は番号 1 から開始されるので、+1 の位置を指定すると、ルーチンの最初の行の後にコード行が挿入されます。ルーチンの最初、またはラベル付けされたセクションの最初 (既存の最初の行の前) に行を挿入するときは、+0 のオフセットを使用します。例えば、以下のようになります。
ZINSERT "Altstart SET c=12,d=8":+0
上記の例では、ルーチンの最初にコード行を挿入します。+0 のオフセットを使用することで (または location を省略することで)、別の空の現在ルーチンに行を挿入できます。
ラベルは、31 文字よりも長くすることができますが、最初の 31 文字は一意である必要があります。ZINSERT は、指定された label の最初の 31 文字のみと一致します。ラベル名では大文字と小文字が区別され、Unicode 文字を含めることができます。
例
以下の例では、現在のルーチンの 4 番目の行の後にコード行 SET x=24 が挿入されます。挿入されたこのコード行はラベルで開始されていないため、最初のスペースは必要な行開始文字として含まれる必要があります。
ZINSERT " SET x=24":+4
以下の例では、現在ロードされているルーチンに、"Checktest" と呼ばれるラベルが含まれていると仮定します。ZINSERT コマンドは、Checktest 内の 6 番目の行の後に新しい行を挿入します (Checktest+6)。新規の行には、"Altcheck" というラベルと SET y=12 というコマンドが含まれます。
ZINSERT "Altcheck SET y=12":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
メモ
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 コマンドにコード行を提供することもできるので、プログラマ・プロンプトにコード行を提供します。