ObjectScript の概要
ObjectScript は、InterSystems IRIS® データ・プラットフォームに組み込まれた、完全に汎用的なプログラミング言語です。ObjectScript のソース・コードは、InterSystems IRIS 仮想マシン内で実行されるオブジェクト・コードにコンパイルされます。このオブジェクト・コードは、文字列操作やデータベース・アクセスなど、ビジネス・アプリケーションで一般的な処理を実行するために、高度に最適化されています。ObjectScript プログラムは、InterSystems IRIS がサポートするすべてのプラットフォーム間で完全に移植可能です。
以下のいずれのコンテキストでも、ObjectScript を使用できます。
-
InterSystems IRIS クラスのメソッドの実装言語として使用 (クラス定義は正式には ObjectScript の一部ではありません。むしろ、クラス定義の特定の部分内で ObjectScript を使用できます)。
-
InterSystems SQL のストアド・プロシージャとトリガに対する実装言語として。
-
ルーチンを作成するため。
-
ObjectScript シェルでインタラクティブに。
ObjectScript で演算子の評価順序は、必ず左から右です。したがって、式の演算は表示された順番で実行されます。式で明示的に小括弧を使用して、特定の演算子を先に処理させます。
機能
以下は、ObjectScript の主な機能です。
ObjectScript のサンプル・クラス
クラス定義は ObjectScript の一部ではありませんが、ObjectScript を複数の場所に含めることができます。また、クラスはルーチンにコンパイルされ、最終的には同じ実行時コードにコンパイルされます。 クラス内では、ObjectScript はメソッドの実装として最もよく使用されます。
以下は、いくつかの一般的な ObjectScript コマンド、演算子、および関数と、メソッド内でのコードの構成方法を示すサンプル・クラスです。
Class User.DemoClass
{
/// Generate a random number.
/// This method can be called from outside the class.
ClassMethod Random() [ Language = objectscript ]
{
set rand=$RANDOM(10)+1 ; rand is an integer in the range 1-10
write "Your random number: "_rand
set name=..GetNumberName(rand)
write !, "Name of this number: "_name
}
/// Input a number.
/// This method can be called from outside the class.
ClassMethod Input() [ Language = objectscript ]
{
read "Enter a number from 1 to 10: ", input
set name=..GetNumberName(input)
write !, "Name of this number: "_name
}
/// Given an number, return the name.
/// This method can be called only from within this class.
ClassMethod GetNumberName(number As %Integer) As %Integer [ Language = objectscript, Private ]
{
set name=$CASE(number,1:"one",2:"two",3:"three",
4:"four",5:"five",6:"six",7:"seven",8:"eight",
9:"nine",10:"ten",:"other")
quit name
}
/// Write some interesting values.
/// This method can be called from outside the class.
ClassMethod Interesting() [ Language = objectscript ]
{
write "Today's date: "_$ZDATE($HOROLOG,3)
write !,"Your installed version: "_$ZVERSION
write !,"Your username: "_$USERNAME
write !,"Your security roles: "_$ROLES
}
}
以下の点に注意してください。
-
Random() メソッドおよび Input() メソッドは、GetNumberName() メソッド (このクラスに対してプライベートであり、クラスの外部からは呼び出せない) を呼び出します。
-
WRITE、QUIT、SET、および READ は ObjectScript コマンドです。この言語には、ほかに変数を削除するコマンド、プログラム・フローを制御するコマンド、入出力デバイスを制御するコマンド、トランザクションを管理するコマンド (ネスト可能) などがあります。
コマンドの名前では大文字小文字は区別されませんが、規約によって実行されるテキストではすべて大文字で表記します。
-
このサンプルには 2 つの ObjectScript 演算子が含まれています。プラス記号 (+) は加算を、アンダースコア (_) は文字列連結を実行します。
ObjectScript には、通常の演算子以外に他の言語にはないいくつかの特別な演算子があります。
-
$RANDOM、$CASE、および $ZDATE は ObjectScript 関数です。
この言語は、文字列処理、多くの種類の変換、フォーマット処理、算術演算などのための関数を提供します。
-
$HOROLOG、$ZVERSION、$USERNAME、および $ROLES は、ObjectScript システム変数 (InterSystems IRIS では特殊変数と呼ぶ) です。大部分の特殊変数には、InterSystems IRIS 操作環境の状況、現在の処理状態などに対応した値が格納されます。
-
ObjectScript は、コメント行、ブロック・コメント、文の終わりのコメントをサポートします。
デモンストレーションとして、このクラスのメソッドを ObjectScript シェルで実行できます。これらの例では、TESTNAMESPACE> はシェルに表示されるプロンプトです。同じ行の、プロンプトの後にあるテキストは、入力されたコマンドです。その後の行は、応答としてシステムによってシェルに書き込まれた値を示しています。
TESTNAMESPACE>do ##class(User.DemoClass).Input()
Enter a number from 1 to 10: 7
Name of this number: seven
TESTNAMESPACE>do ##class(User.DemoClass).Interesting()
Today's date: 2021-07-15
Your installed version: IRIS for Windows (x86-64) 2019.3 (Build 310U) Mon Oct 21 2019 13:48:58 EDT
Your username: SuperUser
Your security roles: %All
TESTNAMESPACE>
サンプル・ルーチン
以下に、demoroutine という名前のサンプル・ObjectScript ルーチンを示します。このルーチンには、前述のセクションのサンプル・クラスで示したメソッドとまったく同じ処理を行うプロシージャが含まれます。
; this is demoroutine
write "Use one of the following entry points:"
write !,"random"
write !,"input"
write !,"interesting"
quit
//this procedure can be called from outside the routine
random() public {
set rand=$RANDOM(10)+1 ; rand is an integer in the range 1-10
write "Your random number: "_rand
set name=$$getnumbername(rand)
write !, "Name of this number: "_name
}
//this procedure can be called from outside the routine
input() public {
read "Enter a number from 1 to 10: ", input
set name=$$getnumbername(input)
write !, "Name of this number: "_name
}
//this procedure can be called only from within this routine
getnumbername(number) {
set name=$CASE(number,1:"one",2:"two",3:"three",
4:"four",5:"five",6:"six",7:"seven",8:"eight",
9:"nine",10:"ten",:"other")
quit name
}
/* write some interesting values
this procedure can be called from outside the routine
*/
interesting() public {
write "Today's date: "_$ZDATE($HOROLOG,3)
write !,"Your installed version: "_$ZVERSION
write !,"Your username: "_$USERNAME
write !,"Your security roles: "_$ROLES
}
以下の点に注意してください。
-
実際にキャレット (^) で始まる識別子のみがグローバルの名前です。この点については、このページで後述します。ただし、実行されるテキストおよびコード・コメント内では、ルーチンを呼び出すときにキャレットを使用するため、一般的に、ルーチンの名前がキャレットで始まっているかのように、ルーチンが参照されます (このページで後述します)。例えば、demoroutine というルーチンは、通常、^demoroutine と呼び出されます。
-
ルーチン名は、そのルーチン内に含める必要はありません。ただし、多くのプログラマは、ルーチンの最初にコメントとして、またはルーチンの最初のラベルとしてルーチン名を含めます。
-
ルーチンには、複数のラベル (random、input、getnumbername、および interesting) があります。
プロシージャ (この例の場合) および従来の形式のサブルーチンの開始点を示すためにラベルを使用します。これらは、特定のコマンドの宛先としても使用できます。
ラベルは、一般的にルーチン内で使用されますが、メソッド内でも使用できます。
ラベルは、エントリ・ポイントまたはタグとも呼ばれます。
-
random および input サブルーチンは、このルーチンに対してプライベートである getnumbername サブルーチンを呼び出します。
デモンストレーションとして、このルーチンの一部を ObjectScript シェルで実行できます。最初に、以下はルーチン自体を実行するセッションを示しています。
TESTNAMESPACE>do ^demoroutine
Use one of the following entry points:
random
input
TESTNAMESPACE>
ルーチンを実行するときは、ここに示すようにヘルプ情報が表示されます。ルーチンをこのように記述することは必須ではありませんが、一般的です。ルーチンには、最初のラベルの前に QUIT が含まれており、それによって、ユーザがそのルーチンを呼び出したときに、そのラベルの前で処理が停止されます。この方法も必須ではありませんが、一般的です。
次に、以下に 1 組みのサブルーチンの動作のしかたを示します。
TESTNAMESPACE>do input^demoroutine
Enter a number from 1 to 10: 7
Name of this number: seven
TESTNAMESPACE>do interesting^demoroutine
Today's date: 2018-02-06
Your installed version: IRIS for Windows (x86-64) 2018.1 (Build 513U) Fri Jan 26 2018 18:35:11 EST
Your username: _SYSTEM
Your security roles: %All
TESTNAMESPACE>
メソッドには、ルーチンの場合と同じ文、同じラベル、同じコメントを含めることができます。つまり、ルーチンのコンテンツについてここで説明する情報は、メソッドのコンテンツにも当てはまります。
変数
ObjectScript には、データの保持方法で分類した場合、主に次の 2 種類の変数があります。変数の名前は、変数の種類を決定します。
-
ローカル変数。データをメモリに保持します。
ローカル変数の範囲は、パブリックまたはプライベートです。
ローカル変数名の例としては、MyVar や %MyVar などが挙げられます。
-
グローバル変数。データをデータベースに保持します。これらは、グローバルとも呼ばれます。グローバルとのやり取りはすべて、データベースに直接作用します。例えば、グローバルの値を設定した場合、その変更は、格納されているデータに直ちに作用し、値を格納するために別のステップは行われません。同様に、グローバルを削除すると、そのデータはデータベースから直ちに削除されます。
グローバル変数名の例としては、^MyVar や ^%MyVar などが挙げられます。
"ObjectScript の変数と範囲" を参照してください
多次元配列
ObjectScript では、どの変数も InterSystems IRIS 多次元配列 (配列とも呼ぶ) にすることができます。オブジェクト・プロパティは多次元配列にすることもできます (そのように宣言した場合)。多次元配列は、通常、何らかの関連を持つ一連の値を保持することを目的としています。ObjectScript には、値への便利で高速なアクセスを可能にするコマンドと関数があります。
多次元配列を直接操作するかどうかは、使用する API と好みによって異なります。InterSystems IRIS には、一連の関連する値のためのコンテナが必要な場合に使用するクラスベースの代替手段があります。"コレクション・クラス" を参照してください。
基本情報
多次元配列は、添え字で定義される、任意の数のノードで構成されます。以下の例では、配列のいくつかのノードが設定され、その配列のコンテンツが印刷されます。
set myarray(1)="value A"
set myarray(2)="value B"
set myarray(3)="value C"
zwrite myarray
この例は、一般的な例を示しています。注 :
-
この配列には 1 つの添え字があります。この場合、添え字は整数 1、2、および 3 です。
-
事前に配列の構造を宣言する必要はありません。
-
myarray は、その配列自体の名前です。
-
ObjectScript には、配列全体または特定ノードに対して作用できるコマンドおよび関数があります。以下に例を示します。
kill myarray
また、特定のノードおよびその子のノードを削除することもできます。
-
以下のバリエーションは、^myglobal という名前のグローバル配列のいくつかの添え字を設定します。つまり、これらの値がディスクに書き込まれます。
set ^myglobal(1)="value A" set ^myglobal(2)="value B" set ^myglobal(3)="value C"
-
グローバル参照には長さの制限があります。この制限は、グローバル名の長さ、および添え字の長さと数に影響します。制限を超えた場合、<SUBSCRIPT> エラーが発生します。"グローバル参照の最大長" を参照してください。
-
ノードの値の長さは、文字列長の制限未満にする必要があります。
多次元配列は、定義済みノードごとに 1 つの予約済みメモリ位置を持っており、それ以外は持っていません。グローバルの場合、それが使用するディスク領域はすべて動的に割り当てられます。
構造のバリエーション
上記の例は、配列の一般的な形を示しています。以下の使用可能なバリエーションに注意してください。
-
添え字の数に制限はありません。以下に例を示します。
Set myarray(1,1,1)="grandchild of value A"
-
添え字は文字列にすることができます。以下も有効です。
set myarray("notes to self","2 Dec 2010")="hello world"
使用上の注意
ObjectScript の学習者がよく犯す誤りは、グローバルと配列を混同することです。どの変数もローカルかグローバルのいずれかであり、さらに添え字ありか添え字なしのいずれかであることを忘れないでください。以下の表は、その例を示しています。
変数の種類 | 例と注意 |
---|---|
ローカル変数 (添え字なし) | Set MyVar=10
このような変数はきわめて一般的です。変数の大部分はこのような変数です。 |
ローカル変数 (添え字付き) |
Set MyVar(1)="alpha" Set MyVar(2)="beta" Set MyVar(3)="gamma" このようなローカル配列は、一連の関連するデータを渡す場合に便利です。 |
グローバル変数 (添え字なし) | Set ^MyVar="saved note"
実際、グローバルには通常添え字があります。 |
グローバル変数 (添え字付き) | Set ^MyVar($USERNAME,"Preference 1")=42 |
演算子
このセクションでは、ObjectScript の演算子の概要について説明します。よく知られているものと、あまり知られていないものがあります。
ObjectScript で演算子の評価順序は、必ず左から右です。したがって、式の演算は表示された順番で実行されます。式で明示的に小括弧を使用して、特定の演算子を先に処理させることができます。
通常、括弧は、必ずしも必要でない場所にも使用します。これは、他のプログラマに (および後で作成者自身に)、コードの意図を明確にすることができるので便利です。
よく知られている演算子
ObjectScript には、一般的なアクティビティのための以下の演算子があります。
-
算術演算子 : 加算 (+)、減算 (-)、除算 (/)、乗算 (*)、整数除算 (\)、剰余 (#)、および指数 (**)
-
単項演算子 : 正 (+)、および負 (-)
-
文字列連結演算子 (_)
-
論理比較演算子 : 等しい (=)、より大きい (>)、以上 (>=)、より小さい (<)、以下 (<=)
-
論理補数演算子 (')
これは、論理値の直前および論理比較演算子の直前に使用できます。
-
論理値を組み合わせる演算子 : AND (&&)、OR (||)
ObjectScript では、これらの演算子それぞれの古くて効率的でない形式 (&& 演算子の &、|| 演算子の !) もサポートされています。これらの古い形式は、既存のコードに使用されていることがあります。
あまり知られていない演算子
ObjectScript には、いくつかの言語に同等のものがない演算子もあります。最も重要なものは以下のとおりです。
-
パターン・マッチング演算子 (?) は、左オペランドの文字パターンが、その右オペランドのパターンを使用しているかどうかを判断します。パターンが発生する回数、代替パターン、パターンの入れ子などを指定できます。
例えば、以下は、文字列 (testthis) が米国の社会保障番号の書式である場合は、値 1 (True) を、それ以外の場合は 0 を返します。
Set testthis="333-99-0000" Write testthis ?3N1"-"2N1"-"4N
これは、入力データの妥当性を確保するための価値のあるツールであり、クラス・プロパティの定義内で使用できます。
-
二項包含関係演算子 ([) は、右のオペランドの一連の文字が、左の文字の部分文字列であるかどうかによって、1 (True) または 0 (False) を返します。以下に例を示します。
Set L="Steam Locomotive",S="Steam" Write L[S
-
二項後続関係演算子 (]) は、左のオペランドの文字が、ASCII 文字順で右のオペランドの文字の後に来るかどうかを判断します。
-
二項前後関係演算子 (]]) は、左のオペランドが数値添え字の照合順序で右のオペランドの後に順番に並んでいるかを判定します。
-
間接演算子 (@) により、コマンド引数、変数名、添え字リスト、またはパターンの一部またはすべてを実行時に動的に置き換えることができます。InterSystems IRIS は、関連するコマンドを実行する前に、置換を実行します。
コマンド
このセクションでは、これから使用する可能性が高いコマンド、および ObjectScript でよく使用されているコマンドの概要について説明します。これらには、他の言語に類似したコマンドと、他の言語には同等のものがないコマンドがあります。
コマンドの名前では大文字小文字は区別されませんが、規約によって実行されるテキストではすべて大文字で表記します。
よく知られているコマンド
ObjectScript には、以下のようなよく知られたタスクを実行するためのコマンドがあります。
-
変数を定義するには、前述のように SET を使用します。
-
変数を削除するには、前述のように KILL を使用します。
-
ロジックのフローを制御するには、以下のコマンドを使用します。
-
IF、ELSEIF、および ELSE。これらは連携して機能します。
-
FOR
-
WHILE。単独で使用できます。
-
DO および WHILE。これらは一緒に使用できます。
-
QUIT。これも値を返すことができます。
フローを制御するコマンドはほかにもありますが、それらはあまり使用されません。
-
-
エラーをトラップするには、TRY および CATCH を使用します。これらは連携して機能します。"TRY-CATCH の使用法" を参照してください。
-
値を書き込むには、WRITE を使用します。これは、現在のデバイス (例えば、ターミナルやファイル) に値を書き込みます。
このコマンドを引数なしで使用した場合、すべてのローカル変数の値を書き込みます。これは、特にターミナルで便利です。
このコマンドは、出力を配置する一連の形式制御コード文字を使用できます。既存のコードでは、新しい行を開始するために感嘆符が使用されている場合があります。以下に例を示します。
write "hello world",!,"another line"
-
現在のデバイス (例えば、ターミナル) から値を読み取るには、READ を使用します。
-
主デバイス以外のデバイスを使用するには、以下のコマンドを使用してください。
-
OPEN は、デバイスを使用可能にします。
-
USE は、使用可能になったデバイスを WRITE および READ で使用するために現在のデバイスとして指定します。
-
CLOSE は、デバイスを使用不可にします。
-
-
同時処理を制御するには、LOCK を使用します。InterSystems IRIS のロック管理システムは、他の言語の同様のシステムとは異なる点に注意してください。この動作のしくみを再確認することが重要になります。"ロックと並行処理の制御" を参照してください。
-
トランザクションを管理するには、TSTART、TCOMMIT、TROLLBACK、および関連コマンドを使用します。"トランザクション処理" を参照してください。
-
デバッグするには、ZBREAK および関連コマンドを使用します。
-
実行を中断するには、HANG を使用します。
多次元配列で使用するコマンド
ObjectScript では、以下の方法で多次元配列を操作できます。
-
ノードを定義するには、SET コマンドを使用します。
-
個別のノードまたはすべてのノードを削除するには、KILL コマンドを使用します。
例えば、以下は、多次元配列全体を削除します。
kill myarray
以下は、対照的にノード myarray("2 Dec 2010") およびその子すべてを削除します。
kill myarray("2 Dec 2010")
-
グローバルまたはグローバル・ノードを削除するが、その下位サブノードは削除しない場合は、ZKILL を使用します。
-
多次元配列のすべてのノードに繰り返し処理を行い、それらすべてを書き込むには、ZWRITE を使用します。これは、特にターミナルで便利です。以下のターミナル・セッションの例は、出力がどのようなものになるのかを示しています。
TESTNAMESPACE>ZWRITE ^myarray ^myarray(1)="value A" ^myarray(2)="value B" ^myarray(3)="value C"
この例では、ローカル変数ではなくグローバル変数を使用しますが、どちらも多次元配列にすることができることを忘れないでください。
-
一連のノードを 1 つの多次元配列から別の多次元配列に、ターゲットに既存のノードを残したままコピーするには、MERGE を使用します。例えば、以下のコマンドはメモリ内の配列 (sourcearray) 全体を新しいグローバル (^mytestglobal) にコピーします。
MERGE ^mytestglobal=sourcearray
これは、コードをデバッグしているときに、使用している配列のコンテンツを調べるのに便利です。
システム関数
このセクションでは、最もよく使用される ObjectScript 関数のいくつかを目的別にグループ分けして紹介します。これらの関数の名前では、大文字と小文字は区別されません。
-
値の選択 : $SELECT および $CASE
-
変数 (または変数のノード) が存在しているかどうかのテスト : $DATA および $GET
-
ネイティブのリスト形式のリストの作成と操作 : $LISTBUILD、$LISTGET、$LIST など。"ObjectScript のリスト" を参照してください。こちらでは、代替案も紹介しています。
-
多次元配列の操作 : $ORDER、$QUERY、$DATA、$GET。"多次元配列" を参照してください。こちらでは、代替案も紹介しています。
-
文字列に含めるための、入力できない文字の作成 : $CHAR。整数を指定すると、$CHAR は、対応する ASCII または Unicode 文字を返します。一般的な使用法は以下のとおりです。
-
$CHAR(9) はタブです。
-
$CHAR(10) は改行です。
-
$CHAR(13) はキャリッジ・リターンです。
-
$CHAR(13,10) はキャリッジ・リターンと改行のペアです。
関数 $ASCII は、指定された文字の ASCII 値を返します。"ObjectScript の文字列" を参照してください。
-
簡潔にまとめた全リストは、"ObjectScript 関数" を参照してください。
InterSystems IRIS クラス・ライブラリでも、豊富な API のセットを提供しています。"ツールの索引" を参照してください。
特殊変数
このセクションでは、InterSystems IRIS のいくつかの特殊変数について説明します。これらの変数の名前では、大文字と小文字は区別されません。
いくつかの特殊変数は、コードが実行されている環境に関する情報を提供します。これには、以下が含まれます。
-
$HOROLOG。これには、オペレーティング・システムから提供される、現在のプロセスの日付と時刻が格納されます。"日付と時刻の値" を参照してください。
-
$USERNAME および $ROLES。これには、現在使用しているユーザ名と、そのユーザが属しているロールに関する情報が格納されます。
write "You are logged in as: ", $USERNAME, !, "And you belong to these roles: ",$ROLES
-
$ZVERSION。これには、現在動作している InterSystems IRIS のバージョンを表す文字列が格納されます。
そのほかに $JOB、$ZTIMEZONE、$IO、および $ZDEVICE があります。
他の変数は、コードの処理状態に関する情報を提供します。それらには、$STACK、$TLEVEL、$NAMESPACE、および $ZERROR があります。
$SYSTEM 特殊変数
特殊変数 $SYSTEM は、一連の多数のユーティリティ・メソッドへの簡単なアクセスを提供します。
$SYSTEM 特殊変数は、%SYSTEM パッケージのエイリアスであり、そのパッケージには、幅広いニーズに対応するクラス・メソッドを提供するクラスが含まれています。%SYSTEM のメソッドを参照する一般的な方法は、$SYSTEM 変数を使用する参照を構築することです。例えば、以下のコマンドは %SYSTEM.OBJOpens in a new tab クラスの SetFlags() メソッドを実行します。
DO $SYSTEM.OBJ.SetFlags("ck")
特殊変数の名前は、クラス名やそのメンバ名とは異なり、大文字と小文字が区別されないため、以下のコマンドはすべて等価です。
DO ##class(%SYSTEM.OBJ).SetFlags("ck")
DO $System.OBJ.SetFlags("ck")
DO $SYSTEM.OBJ.SetFlags("ck")
DO $system.OBJ.SetFlags("ck")
このクラスにはすべて、Help() メソッドがあり、これはそのクラスで使用可能なメソッドのリストを出力できます。以下に例を示します。
TESTNAMESPACE>do $system.OBJ.Help()
'Do $system.OBJ.Help(method)' will display a full description of an individual method.
Methods of the class: %SYSTEM.OBJ
CloseObjects()
Deprecated function, to close objects let them go out of scope.
Compile(classes,qspec,&errorlog,recurse)
Compile a class.
CompileAll(qspec,&errorlog)
Compile all classes within this namespace
....
また、メソッドの名前を Help() の引数として使用することもできます。以下に例を示します。
TESTNAMESPACE>d $system.OBJ.Help("Compile")
Description of the method:class Compile:%SYSTEM.OBJ
Compile(classes:%String="",qspec:%String="",&errorlog:%String,recurse:%Boolean=0)
Compile a class.
<p>Compiles the class <var>classes</var>, which can be a single class, a comma separated list,
a subscripted array of class names, or include wild cards. If <var>recurse</var> is true then
do not output the intial 'compiling' message or the compile report as this is being called inside
another compile loop.<br>
<var>qspec</var> is a list of flags or qualifiers which can be displayed with
'Do $system.OBJ.ShowQualifiers()'
and 'Do $system.OBJ.ShowFlags()
潜在的な落とし穴
以下の項目は、ObjectScript を初めて使用するプログラマ (特に、他のプログラマによって記述されたコードの管理担当者) の混乱を招くことがあります。
-
ルーチンまたはメソッド内では、ラベルが含まれている行以外は、すべての行が少なくとも 1 つのスペースまたは 1 つのタブでインデントされている必要があります。つまり、最初の文字位置にテキストがある場合、コンパイラおよび IDE ではそれがラベルとして処理されます。
ただし、例外が 1 つあり、中括弧は最初の文字位置に配置できます。
-
コマンドとその最初の引数の間には 1 つのスペース (タブではない) を配置する必要があります。それ以外の場合は、IDE では構文エラーがあると表示されます。
同様に、ObjectScript シェルでは、以下のような構文エラーが表示されます。
TESTNAMESPACE>write 5 WRITE 5 ^ <SYNTAX> TESTNAMESPACE>
-
ObjectScript で演算子の評価順序は、必ず左から右です。したがって、式の演算は表示された順番で実行されます。式で明示的に小括弧を使用して、特定の演算子を先に処理させることができます。
通常、括弧は、必ずしも必要でない場所にも使用します。これは、他のプログラマに (および後で作成者自身に)、コードの意図を明確にすることができるので便利です。
-
これまでの使用法により、ObjectScript は空の文字列 ("") を ASCII の NULL 値と同等とは見なしません。ASCII の NULL 値を表現するには、$CHAR(0) を使用します。($CHAR は、ASCII 文字 (特定の 10 進数ベースのコード) を返すシステム関数です。)以下に例を示します。
write "" = $char(0)
同様に、ObjectScript 値が SQL または XML に投影されるときには、値 "" と $CHAR(0) は異なる方法で処理されます。これらの値の SQL プロジェクションの詳細は、"NULL および空文字列" を参照してください。これらの値の XML プロジェクションの詳細は、"空文字列および NULL 値の処理" を参照してください。
-
ObjectScript には、大文字と小文字を区別する場合とそうでない場合があります。大文字と小文字を区別しないものには、コマンド、関数、特殊変数、ネームスペース、およびユーザの名前があります。
大文字と小文字を区別するものには、定義する要素の大部分 (ルーチン、変数、クラス、プロパティ、およびメソッド) の名前があります。詳細は、"構文ルール" を参照してください。
-
ほとんどのコマンド名は省略形で表現できます。したがって、WRITE、Write、write、W、および w はいずれも、WRITE コマンドの有効な形式です。リストは、"ObjectScript で使用する省略形" を参照してください。
-
多くのコマンドに対して、後置条件式 (単に後置条件と呼ばれることが多い) を含めることができます。
この式は、InterSystems IRIS がコマンドを実行するかどうかを制御します。後置条件式の評価が True (ゼロ以外の値) の場合、InterSystems IRIS はそのコマンドを実行します。式の評価が False (ゼロまたは NULL) の場合、InterSystems IRIS はコマンドを無視し、次のコマンドに実行を移します。
以下に例を示します。
Set count = 6 Write:count<5 "Print this if count is less than five" Write:count>5 "Print this if count is greater than five"
上記のコードは、次の出力を生成します。Print this if count is greater than five
Note:後置条件の使用経験がないと、“後置条件式”という表現を誤解してしまう可能性があります。この表現では、コマンドの後に式が実行されるという、誤った暗示を与えてしまうためです。その名前にかかわらず、後置条件はコマンドの前に実行されます。
特定のコマンドの特定の引数には、後置条件も許可されます。
-
1 つの行に複数のコマンドを含めることができます。以下に例を示します。
set myval="hello world" write myval
これを行うには、その行に追加のコマンドがある場合は、引数を取らないコマンドの後には必ずスペースを 2 つ使用してください。そのようにしない場合は構文エラーが発生します。
-
IF、ELSE、FOR、および DO コマンドは、以下の 2 つの形式で使用できます。
-
新しいブロック形式。中括弧を使用してブロックを示します。以下に例を示します。
if (testvalue=1) { write "hello world" }
インターシステムズでは、新しいコードすべてでブロック形式を使用することをお勧めします。
-
古い行ベースの形式。中括弧は使用しません。以下に例を示します。
if (testvalue=1) write "hello world"
-
-
前述の項目を使用すると、ObjectScript をとてもコンパクトな形式で記述できます。以下に例を示します。
s:$g(%d(3))'="" %d(3)=$$fdN3(%d(3)) q
クラス・コンパイラによって、上記のコンパクトな形式のコードが自動的に生成されます (この例のように省略された形式になるとは限りません)。場合によっては、問題の原因を追跡するため、または何かの機能のしかたを理解するために、この生成されたコードを調べると役立ちます。
-
ObjectScript には予約語がないため、例えば、set という変数を使用することも理論的には可能です。ただし、コマンド、関数、SQL 予約語、および特定のシステム項目の名前は避けた方が無難です。"構文規則" を参照してください。
-
InterSystems IRIS では、文字列操作の結果を保存するために、一定容量を持つメモリが割り当てられます。割り当てられた容量を超える文字列式が発生すると、<MAXSTRING> エラーとなります。"文字列長の制限" を参照してください。
クラス定義の場合、文字列演算の制限は文字列プロパティのサイズに影響します。InterSystems IRIS では、この上限を超える文字列を操作する必要がある場合に使用できるシステム・オブジェクト (ストリームと呼ばれる) があります。そのような場合は、ストリーム・インタフェース・クラスを使用します。
関連項目
ObjectScript を詳細に学習するには、以下も参照してください。
-
ObjectScript チュートリアル - 大半の言語要素に対しインタラクティブな概要について
-
ObjectScript リファレンス - 個別のコマンドと関数について