^%ZLANG ルーチンによる言語の拡張
^%ZLANG 機能を使用すると、ObjectScript などの言語に、カスタムのコマンド、関数、および特殊変数を追加することができます。拡張機能は標準機能と同じ方法で呼び出され、構文、演算子の優先順位などに関する同一の規則に従います。通常、^%ZLANG 機能の実行速度は標準の InterSystems IRIS 機能ほど速くありません。パフォーマンスが重要なルーチンをコーディングする際には、この点を考慮してください。
このような拡張機能を追加する手順は以下のとおりです。
-
必要に応じて、以下の名前でルーチンを定義します。
ルーチン名 目的 ^%ZLANGC00 カスタムの ObjectScript コマンドを定義します。 ^%ZLANGF00 カスタムの ObjectScript 関数を定義します。 ^%ZLANGV00 カスタムの ObjectScript 特殊変数を定義します。 -
これらのルーチンでは、パブリックのサブルーチンを以下のように定義します。
-
サブルーチンのラベルでは、定義するコマンド、関数、または特殊変数の名前を使用します。
名前は英文字の Z で始まる必要があり、英字のみを含めることができます。ロケールでアルファベットとして定義すれば、Unicode 文字が使用できます。英文字はすべて大文字にする必要がありますが、実行の際は大文字と小文字の区別はありません。名前の最大長は 31 文字です。
名前は既存のコマンド、関数、または特殊変数と同じにすることはできません (同一の場合、InterSystems IRIS では無視されます)。SQL 予約語は使用しないことを強くお勧めします。
関数を定義する場合、関数に引数がない場合でも、ラベルには括弧を含める必要があります。
特殊変数のラベルには括弧を含めることができます。
-
オプションで別のラベルを含めて、略称を定義します。その略称が InterSystems IRIS で使用されていないように注意してください。
-
サブルーチンを適切に定義します。詳細は、“メモ” セクションを参照してください。
-
-
親ルーチンにある最初のコマンドでは QUIT を使用することをお勧めします。こうしておけば、ユーザがルーチンを直接呼び出しても、何も起こりません。
また、ルーチンでコメントを上部に記載して、ルーチン自体の名前を示すようにすると便利です。
(正確ではありませんが) 慣習的に、ルーチンは名前の一部にキャレットがあるかのように参照されます。このドキュメントでは、この慣習に従います。
他のサブルーチンの場合、パブリックのサブルーチンで呼び出されるものを含めて、それらのラベルは必ず、小文字のみか大文字と小文字を混在して記述します (先頭は Z にしない)。または、プライベートのサブルーチンとして実装します。
つまり、^%ZLANG ルーチンによって言語が拡張されるので、目的のサブルーチンのみが外部で利用できるようにすることが重要です。
メモ
コマンドは、ルーチンやプロシージャの DO のように処理されます。引数は、呼び出しのパラメータとして渡されます。
コードの結果にする場合を除いて、$TEST や $ZREFERENCE など、システム状態の値をコードで保持する必要があります (ただし、関数や特殊変数の場合、システムでは $TEST が自動的に保持されます)。
特殊変数の値を設定できます。変数のエントリ・ポイントは 1 つのみです。値を設定するか値を取得するかを判断するには、引数が指定されているかどうかをコードで調べる必要があります。以下はその例です。
ZVAR(NewValue) public {
if $DATA(NewValue) Set ^||MyVar=NewValue Quit
Quit $GET(^||MyVar)
}
そうすると、以下に示すように、ユーザはこの変数を設定するか、または変数を取得できます。
USER>w $ZVAR
USER>s $ZVAR="xyz"
USER>w $ZVAR
xyz
コマンドまたは関数からエラー・コードを返すには、$SYSTEM.Process.ThrowError() を使用します。
例
例えば、カスタムの特殊変数を定義して ObjectScript で使用するには、以下のようにして、^%ZLANGV00 ルーチンを定義します。
; implementation of ^%ZLANGV00
; custom special variables for ObjectScript
QUIT
ZVERNUM ; tag becomes name of a special variable
ZVE
QUIT $PIECE($ZVERSION,"(Build")
次に、デモンストレーションとして、新規の変数はターミナルで以下のように使用できます。
USER>w $zvernum
InterSystems IRIS for Windows (x86-64) 2018.1
USER>w $zve
InterSystems IRIS for Windows (x86-64) 2018.1
別の例として、以下のように ^%ZLANGF00 ルーチンを定義するとします。
; implementation of ^%ZLANGF00
; custom functions for ObjectScript
QUIT
ZCUBE(input) public {
Quit input*input*input
}
次に、デモンストレーションとして、新規の関数はターミナルで以下のように使用できます。
USER>w $zcube(2)
8
以下の例では ^%ZLANGC00 を示します。この例では、システム・ステータス・ユーティリティ ^%SS を実行するコマンドが作成されます。
; %ZLANGC00
; custom commands for ObjectScript
QUIT
ZSS ; tag name of a command to check system status
DO ^%SS
QUIT