ObjectScript コマンドの概要
ここでは、最もよく使用される ObjectScript コマンドをいくつか紹介します。"ObjectScript リファレンス" も参照してください。
値を割り当てるコマンド
SET コマンドを使用して、変数に値を割り当てます。以下は、SET の基本的な構文です。
SET MyVar=expression
ここで、MyVar は変数、expression は指定されたコンテキスに適した任意の ObjectScript 式です。"ObjectScript 変数と範囲" を参照してください。
コードを呼び出すコマンド
ここでは、コードの呼び出しに使用するコマンドについて説明します。
"コードの呼び出しと引数の引き渡し" ページも参照してください。
DO
ObjectScript で任意のルーチン、プロシージャ、またはメソッドを呼び出すには、DO コマンドを使用します。以下は DO の基本的な構文です。
DO ^CodeToInvoke
CodeToInvoke は、InterSystems IRIS システム・ルーチンあるいはユーザ定義ルーチンです。キャレット文字 ^ は、ルーチン名の直前に付ける必要があります。
また、ルーチン内でプロシージャの開始場所を示すラベル (タグともいいます) を参照して、プロシージャを実行することもできます。ラベルは、キャレットの直前に置かれます。以下はその例です。
SET %X = 484
DO INT^%SQROOT
WRITE %Y
このコードは、%X システム変数値を 484 に設定します。その後 DO コマンドを使用して、InterSystems IRIS システム・ルーチン %SQROOT の INT プロシージャを呼び出し、%X の平方根を算出して、%Y に格納します。その後、WRITE コマンドを使用して、%Y の値を表示します。
メソッドの呼び出し時、DO は 1 つの引数として、メソッドを指定する式全体を取得します。引数の形式は、メソッドが インスタンスかクラス・メソッド かどうかにより異なります。クラス・メソッドを呼び出すには、以下の構文を使用します。
DO ##class(PackageName.ClassName).ClassMethodName()
ClassMethodName() は呼び出すクラス・メソッド名、ClassName はメソッドを含むクラス名、PackageName はクラスを含むパッケージ名です。##class() 構文は、コードに必要なリテラル部です。
インスタンス・メソッドを呼び出すには、ローカルでインスタンスを生成されたオブジェクトへのハンドルのみが必要です。
DO InstanceName.InstanceMethodName()
InstanceMethodName() は呼び出すインスタンス・メソッド名、InstanceName はメソッドを含むインスタンス名です。
詳細は "DO" を参照してください。
JOB
DO はフォアグラウンドでコードを実行し、JOB はバックグラウンドで実行します。これは、通常ユーザとの対話なしに、現在のプロセスで単独に実行されます。ジョブ起動プロセスは、明示的に指定された場合を除き、すべてのシステムの既定値を継承します。
詳細は "JOB" を参照してください。
XECUTE
XECUTE コマンドは、1 つ以上の ObjectScript コマンドを実行し、引数として取得する式を評価します (その引数は、1 つ以上の ObjectScript コマンドを含む文字列に評価される必要があります)。実際、各 XECUTE 引数は、DO コマンドによって呼び出される一行サブルーチンに類似しており、引数の最後に達するか、QUIT コマンドに遭遇すると終了します。InterSystems IRIS が引数を実行した後、制御は XECUTE 引数の直後に返されます。
詳細は "XECUTE" を参照してください。
QUIT および RETURN
QUIT コマンドと RETURN コマンドは、両方ともメソッドを含むコード・ブロックの実行を終了させます。引数がない場合、呼び出し元のコードを単に終了します。引数がある場合、返り値としてその引数を使用します。QUIT は、現在のコンテキストを終了し、囲んでいるコンテキストに移動します。RETURN は、現在のプログラムを終了し、プログラムが呼び出された場所に移動します。
以下のテーブルは、QUIT を使用するか RETURN を使用するかを選択する方法を示しています。
Location | QUIT | RETURN |
---|---|---|
ルーチン・コード (ブロック構造になっていない) | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。 | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。 |
TRY または CATCH ブロック | TRY / CATCH ブロック構造のペアを終了し、ルーチンの次のコードに移動します。入れ子にされた TRY または CATCH ブロックから発行された場合、1 レベルを終了し、囲んでいる TRY または CATCH ブロックに移動します。 | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。 |
DO または XECUTE | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。 | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。 |
IF | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。ただし、FOR、WHILE、または DO WHILE ループで入れ子にされている場合、そのブロック構造を終了し、コード・ブロックの後の次の行で続行します。 | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。 |
FOR、WHILE、DO WHILE | ブロック構造を終了し、コード・ブロックの後の次の行で続行します。入れ子にされたブロックから発行された場合、1 レベルを終了し、囲んでいるブロックに移動します。 | ルーチンを終了し、呼び出し元のルーチン (存在する場合) に戻ります。 |
フローを制御するコマンド
コードでロジックを構築するためには、フロー制御が必要です。コードのブロックを条件付きで実行するかまたはバイパスするか、またはコードのブロックを繰り返し実行します。そのために、ObjectScript は以下のコマンドをサポートします。
条件付きの実行
コードのブロックを条件付きで実行するには、ブーリアン (True/False) テストに基づいて、IF コマンドを使用できます。(後置条件式を使用して、個別の ObjectScript コマンドの条件付きの実行を行うことができます。)
IF は、式を引数として取得し、式が True か False かを判断します。True の場合、式の後ろに続くコードのブロックが実行され、False の場合は実行されません。通常、これらは 1 あるいは 0 の値で評価することをお勧めします。しかし、InterSystems IRIS はあらゆる値の条件付きの実行を行い、式の値が 0 の場合は False、ゼロ以外の場合は True として評価します。詳細は "ObjectScript の演算子の概要" を参照してください。
複数の IF ブーリアン・テスト式を、コンマ区切りのリストで指定することができます。これらのテストは、一連の論理 AND テストとして左から順に評価されます。したがって、IF は、すべてのテスト式が True に評価されると、True に評価されます。IF は、テスト式の 1 つが False と評価されると False に評価されます。残りのテスト式は評価されません。
コードは、常に多数のコマンドを含む コード・ブロック で表示されます。コード・ブロックとは、単に { } 括弧内の 1 行以上のコード行のことで、コード・ブロックの前と中には改行を置くことができます。以下の例を考えてみます。
IF、ELSEIF、および ELSE
IF 文は、複数の条件を評価し、条件によってどのコードを実行するのかを指定できます。単純なコマンドと異なり、文とは 1 つ以上のコマンド・キーワード、条件式、コード・ブロックを含みます。IF 文は、以下のものから構成されます。
-
1 つまたは複数の条件式を含む 1 つの IF 節。
-
それぞれが 1 つまたは複数の条件式を含む任意の数の ELSEIF 節。ELSEIF 節 (オプション)。ELSEIF 節は複数でもかまいません。
-
条件式のない、1 つ以下の ELSE 節。ELSE 節は、オプションです。
以下は、IF 文の例です。
READ "Enter the number of equal-length sides in the polygon: ",x
IF x=1 {WRITE !,"It's so far away that it looks like a point"}
ELSEIF x=2 {WRITE !,"I think that's a line, not a polygon"}
ELSEIF x=3 {WRITE !,"It's an equalateral triangle"}
ELSEIF x=4 {WRITE !,"It's a square"}
ELSE {WRITE !,"It's a polygon with ",x," number of sides" }
WRITE !,"Finished the IF test"
詳細は、"IF" のリファレンスを参照してください。
FOR
FOR 文を使用すると、コードのセクションを繰り返し実行できます。数値や文字列値を基に FOR ループを生成できます。
通常、FOR は、コードのそれぞれのループの開始でインクリメントあるいはディクリメントされる数値制御変数の値を基に、コード・ブロックを 0 回以上実行します。制御変数が最後の値に達したとき、制御は FOR ループを終了します。終了値がない場合、ループは QUIT コマンドに遭遇するまで実行を続けます。制御がループを終了すると、制御変数は、最後のループの実行による値を保持します。
以下は、数値 FOR ループの形式です。
FOR ControlVariable = StartValue:IncrementAmount:EndValue {
// code block content
}
すべての値は正数あるいは負数で、スペースは許可されていますが、等符号とコロンの前後には不要です。FOR に続くコード・ブロックは、変数に割り当てられた各値を繰り返します。
例えば、以下の FOR ループは 5 回実行します。
WRITE "The first five multiples of 3 are:",!
FOR multiple = 3:3:15 {
WRITE multiple,!
}
また、変数を使用して、最後の値を決めることもできます。以下の例は、ループが繰り返される回数を指定します。
SET howmany = 4
WRITE "The first ",howmany," multiples of 3 are "
FOR multiple = 1:1:howmany {
WRITE (multiple*3),", "
IF multiple = (howmany - 1) {
WRITE "and "
}
IF multiple = howmany {
WRITE "and that's it!"
}
}
QUIT
この例は、制御変数 multiple を使用して 3 倍しているため、式は multiple*3 となります。また、IF コマンドを使用して、最後の計算の前に and を挿入しています。
この例の IF コマンドは、ObjectScript の優先順位を含む分かりやすい例です (優先順位は、階層に関係なく常に左から右です)。IF 式 multiple = howmany - 1 の括弧がない場合、あるいは全体が括弧で囲まれている場合、式の最初の部分 multiple = howmany は、False (0) となります。したがって、式全体は 0 - 1 となり、結果は -1 であるため、この式は True となります (ループで、最後の繰り返し以外、それぞれの文字列に and を挿入します)。
FOR の引数は、値のリストに設定された変数にすることもできます。この場合、コード・ブロックは、変数に割り当てられたリストで、各項目に対して繰り返します。
FOR item = "A", "B", "C", "D" {
WRITE !, "Now examining item: "_item
}
QUIT コマンドを特定の状況で実行されるようコード・ブロック内に配置し、FOR を終了させるように指定すると、最終値のない FOR の数値形式を記述できます。これにより、繰り返し回数を示すカウンタを提供し、カウンタの値に基づかない条件を使用して、FOR を制御できます。例えば、以下のループはカウンタを使用し、推測された回数をユーザに知らせます。
FOR i = 1:1 {
READ !, "Capital of MA? ", a
IF a = "Boston" {
WRITE "...did it in ", i, " tries"
QUIT
}
}
カウンタが不要な場合、引数なしの FOR を使用できます。
FOR {
READ !, "Know what? ", wh
QUIT:(wh = "No!")
WRITE " That's what!"
}
詳細は "FOR" を参照してください。
WHILE と DO WHILE
2 つの関連するフロー制御コマンド、WHILE と DO WHILE は、それぞれがコード・ブロックでループを実行し、条件に応じて終了します。2 つのコマンドは、条件の評価方法が異なります。WHILE はコード・ブロック全体の前に条件を評価し、DO WHILE はブロックの後に条件を評価します。FOR と同様、コード・ブロック内に QUIT コマンドを記述してループを終了します。
2 つのコマンドの構文は、以下のとおりです。
DO {code} WHILE condition
WHILE condition {code}
以下の例は、ユーザが指定した値までフィボナッチの数列で値を 2 回表示します (最初は DO WHILE 次はWHILE を使用)。
fibonacci() PUBLIC { // generate Fibonacci sequences
READ !, "Generate Fibonacci sequence up to where? ", upto
SET t1 = 1, t2 = 1, fib = 1
WRITE !
DO {
WRITE fib," " set fib = t1 + t2, t1 = t2, t2 = fib
}
WHILE ( fib '> upto )
SET t1 = 1, t2 = 1, fib = 1
WRITE !
WHILE ( fib '> upto ) {
WRITE fib," "
SET fib = t1 + t2, t1 = t2, t2 = fib
}
}
WHILE、DO WHILE、FOR の明確な違いは、WHILE はループの実行前、DO WHILE はループの実行後に制御式の値をテストする必要があり、一方 FOR はループ内ならどこででもテストできる点です。つまり、コード・ブロックに 2 つの部分があり、式の評価によって 2 番目を実行する場合、FOR 文が一番適切です。それ以外の場合、式をコード・ブロックの前か後のいずれに評価するかによって選択します。
エラーを処理するコマンド
エラー処理には TRY / CATCH ブロック構造を使用します。エラー処理のためにブロック構造を作成するには、TRY コマンドおよび CATCH コマンドを使用することをお勧めします。
"TRY-CATCH メカニズム"、および "TRY"、"THROW,"、"CATCH" を参照してください。
トランザクションを処理するコマンド
トランザクション処理には TSTART、TCOMMIT、および TROLLBACK コマンドを使用します。"トランザクション処理"、および "TSTART"、"TCOMMIT"、"TROLLBACK" を参照してください。
ロックと並行処理の制御のコマンド
リソースをロックまたはロック解除するには LOCK コマンドを使用します。"ロックと並行処理の制御" および "LOCK" を参照してください。
ロックはトランザクション処理とも関連があります。"トランザクション処理" を参照してください。
Write コマンド
ObjectScript は、現在の出力デバイスにリテラルと変数値を表示 (書き込み) する、以下の 4 つのコマンドをサポートしています。
引数なしの表示コマンド
-
引数なしの WRITE は、定義済みの各ローカル変数の名前と値を表示します (行ごとに 1 つの変数を表示します)。パブリック変数とプライベート変数の両方がリスト表示されます。グローバル変数、プロセス・プライベート・グローバルまたは特殊変数はリスト表示されません。変数は照合シーケンス順でリスト表示されます。添え字ツリー順で添え字付き変数をリストします。
すべてのデータ値は、二重引用符文字で区切られ、引用符で囲まれた文字列として表示されます。ただし、キャノニック形式の数とオブジェクト参照を除きます。オブジェクト参照 (OREF) 値が割り当てられた変数は、variable=<OBJECT REFERENCE>[oref] として表示されます。%List 形式の値またはビット文字列の値は、引用符で囲まれた文字列として、それらの値がエンコードされた形式で表示されます。このようなエンコードされた形式には非表示文字が含まれている可能性があるため、%List やビット文字列の表示は空の文字列になることがあります。
WRITE は、特定の非表示文字を表示しません。そうした非表示文字を表現するための、プレースホルダやスペースは表示されません。WRITE は、制御文字を実行します (改行やバックスペースなど)。
-
引数なしの ZWRITE は、引数なしの WRITE と同様に機能します。
-
引数なしの ZZDUMP は、無効なコマンドであり、<SYNTAX> エラーを生成します。
-
引数なしの ZZWRITE は、空の文字列を返す空命令です。
引数ありの表示コマンド
以下の表に、4 つのコマンドの引数付きの形式の機能をリストします。4 つのすべてのコマンドは、1 つの引数または引数のコンマ区切りリストを取ります。4 つのすべてのコマンドは、引数として、ローカル変数、グローバル変数またはプロセス・プライベート変数、リテラル、式、または特殊変数を取ります。
以下の表には、%Library.Utility.FormatString()Opens in a new tab メソッドの既定の戻り値も示されています。FormatString() メソッドは、ZZWRITE とほとんど同じですが、戻り値の一部として %val= をリスト表示しないことと、オブジェクト参照 (OREF) 識別子のみを返す点が異なります。FormatString() を使用すると、ZWRITE/ZZWRITE 形式の戻り値に変数を設定できるようになります。
WRITE | ZWRITE | ZZDUMP | ZZWRITE | FormatString() | |
---|---|---|---|---|---|
各値を別個の行に表示 | なし | あり | あり (1 行に 16 文字) | あり | 1 つの入力値のみ |
識別された変数名 | なし | あり | なし | %val= で表される | なし |
未定義の変数を <UNDEFINED> エラーと表示 | あり | なし (スキップされ、変数名は返されない) | あり | あり | あり |
4 つのすべてのコマンドは、式を評価して、キャノニック形式で数値を返します。
WRITE | ZWRITE | ZZDUMP | ZZWRITE | FormatString() | |
---|---|---|---|---|---|
16 進表現 | なし | なし | あり | なし | なし |
文字列を囲む引用符 (数値と区別するため) | なし | あり | なし | あり (文字列リテラルは %val="value" として返される) | あり |
添え字ノードの表示 | なし | あり | なし | なし | なし |
別のネームスペースのグローバル変数 (拡張グローバル参照) の表示 | あり | あり (拡張グローバル参照構文が示される) | あり | あり | あり |
非表示文字の表示 | なし、表示されない (制御文字は実行される) | あり、$c(n) として表示される | あり、16 進数として表示される | あり、$c(n) として表示される | あり、$c(n) として表示される |
リスト値の形式 | エンコードされた文字列 | $lb(val) 形式 | エンコードされた文字列 | $lb(val) 形式 | $lb(val) 形式 |
%Status 形式 | エンコードされたリストを含んでいる文字列 | $lb(val) 形式のリストを含んでいる文字列、エラーとメッセージを明示する /*... */ コメントが付加される。 | エンコードされたリストを含んでいる文字列 | $lb(val) 形式のリストを含んでいる文字列、エラーとメッセージを明示する /*... */ コメントが付加される。 | $lb(val) 形式のリストを含んでいる文字列、エラーとメッセージを明示する /*... */ コメントが付加される (既定の場合)。 |
ビット文字列形式 | エンコードされた文字列 | $zwc 形式、1 つのビットをリストする /* $bit() */ コメントが付加される。例: %val=$zwc(407,2,1,2,3,5)/*$bit(2..4,6)*/ | エンコードされた文字列 | $zwc 形式、1 つのビットをリストする /* $bit() */ コメントが付加される。例: %val=$zwc(407,2,1,2,3,5)/*$bit(2..4,6)*/ | $zwc 形式、1 つのビットをリストする /* $bit() */ コメントが付加される (既定の場合)。例: %val=$zwc(407,2,1,2,3,5)/*$bit(2..4,6)*/ |
オブジェクト参照 (OREF) 形式 | OREF のみ | <OBJECT REFERENCE>[oref] 形式の OREF。一般情報や属性値などの詳細がリストされる。すべてのサブノードがリストされる | OREF のみ | <OBJECT REFERENCE>[oref] 形式の OREF。一般情報や属性値などの詳細がリストされる。 | OREF のみ (引用符で囲まれた文字列形式) |
JSON の動的配列と JSON のダイナミック・オブジェクトは、該当するコマンドのすべてで OREF 値として返されます。JSON のコンテンツを返すには、以下の例に示すように、%ToJSON() を使用する必要があります。
SET jobj={"name":"Fred","city":"Bedrock"}
WRITE "JSON object reference:",!
ZWRITE jobj
WRITE !!,"JSON object value:",!
ZWRITE jobj.%ToJSON()
READ コマンド
READ コマンドを使用すると、現在の入力装置からエンド・ユーザが入力した内容を受け取り、格納することができます。READ コマンドは、以下の引数を持つことができます。
READ format, string, variable
format は、ユーザの入力エリアが画面に表示される場所を制御し、string は入力プロンプトの前に画面に表示され、variable は入力データを格納します。
以下の形式コードを使用して、ユーザ入力エリアを制御します。
形式コード | 結果 |
---|---|
! | 新しい行を開始します。 |
# | 新しいページを開始します。ターミナルでは、現在の画面をクリアして、新規画面の一番上から開始します。 |
?n | n 番目の列に移動します。n は正の整数です。 |
詳細は "READ" を参照してください。
ファイルとデバイス
ファイルとディレクトリを操作するために、InterSystems IRIS では %File API を提供しています。
さらに、デバイスの操作に使用できる低レベルのコマンドも提供しています。この処理の詳細は、"入出力デバイス・ガイド" で説明されています。詳細は、"OPEN"、"USE"、および "CLOSE" を参照してください。