ObjectScript の概要
ObjectScript は、InterSystems IRIS® データ・プラットフォームに組み込まれた、完全に汎用的なプログラミング言語です。ObjectScript のソース・コードは、InterSystems IRIS 仮想マシン内で実行されるオブジェクト・コードにコンパイルされます。このオブジェクト・コードは、文字列操作やデータベース・アクセスなど、ビジネス・アプリケーションで一般的な処理を実行するために、高度に最適化されています。ObjectScript プログラムは、InterSystems IRIS がサポートするすべてのプラットフォーム間で完全に移植可能です。
以下のいずれのコンテキストでも、ObjectScript を使用できます。
-
InterSystems IRIS クラスのメソッドの実装言語として使用 (クラス定義は正式には ObjectScript の一部ではありません。むしろ、クラス定義の特定の部分内で ObjectScript を使用できます)。
-
InterSystems SQL のストアド・プロシージャとトリガに対する実装言語として使用
-
InterSystems IRIS 内に含まれ実行される個別プログラムである ObjectScript ルーチンを生成するために使用
-
ターミナルのコマンド行からインタラクティブに使用
ObjectScript を詳細に学習するには、以下も参照してください。
-
ObjectScript チュートリアル - 大半の言語要素に対しインタラクティブな概要について
-
ObjectScript リファレンス - 個別のコマンドと関数について
ObjectScript で演算子の評価順序は、必ず左から右です。したがって、式の演算は表示された順番で実行されます。式で明示的に小括弧を使用して、特定の演算子を先に処理させることができます。
機能
以下は、ObjectScript の主な機能です。
言語の概要
ObjectScript は予約語が定義されていないため、任意の単語を識別子 (変数名など) として自由に使用できます。このために、ObjectScript は、組み込みのコマンド一式と特殊文字 (関数名の “$” 接頭語など) を使用して、他の言語要素から識別子を区別します。
例えば、変数に値を割り当てる場合、SET コマンドを使用できます。
SET x = 100
WRITE x
ObjectScript では、以下のプログラムに示すように、任意の有効な名前を識別子名として使用できます (推奨ではありません)。このプログラムと上記のプログラムは、機能的に同じです。
SET SET = 100
WRITE SET
ObjectScript のコンポーネントには、コマンド名や関数名のように、大文字と小文字が区別されないものがあります。また、変数名、ラベル、クラス名、およびメソッド名のように、大文字と小文字が区別される ObjectScript のコンポーネントもあります。詳細は、"大文字と小文字の区別" を参照してください。
ObjectScript のほとんどの場所で、空白を挿入または省略できます。ただし、空白の使用法のうち 2 つには重要な意味があります。
-
コマンドとその引数は少なくとも 1 つのスペースで区切る必要があります。
-
各コマンド行は少なくとも 1 つのスペースでインデントする必要があります。コマンドを行の最初の文字位置から開始したり、続行することはできません。
また、コメントもインデントする必要があります。ただし、ラベルは行の最初の文字位置で開始する必要があります。マクロ・プリプロセッサ文など、他の一部の構文は、行の最初の文字位置で開始できます。詳細は、"空白" を参照してください。
ObjectScript は、コマンド・ターミネータ文字や行ターミネータ文字を使用しません。
言語要素の概要
一番単純な ObjectScript 構文は、以下のような形式で、式でコマンドを呼び出します。
WRITE x
これは、変数 x に WRITE コマンドを実行します (これにより、x の値を表示します)。上記の例で、x は 式 です。ObjectScript 式は、値を算出するために評価される 1 つ以上の “トークン” です。それぞれのトークンは、リテラル、変数、1 つ以上の演算の結果 (2 つの数字の加算の合計など)、関数の評価からの返り値、あるいはこれらのうちの組み合わせなどになります。文の有効な構文には、そのコマンド、関数、式、および演算子が関係しています。
文とコマンド
ObjectScript プログラムは、多くの文から構成されています。それぞれの文が、プログラムで実行する特定の動作を定義します。文には、コマンドと引数があります。
以下に ObjectScript 文があります。
SET x="World"
WRITE "Hello",!,x
WRITE はコマンドです。これは、その名前のとおり、引数として指定された内容を現在の主出力デバイスに書き込みます。この場合、WRITE は、リテラル文字列 “Hello”、“!” 文字 (改行またはキャリッジ・リターンを発行する WRITE コマンドに固有の記号演算子)、および実行時に最新の値に置き換えられるローカル変数 x の 3 つの引数を書き込みます。引数はコンマで区切られ、引数と引数の間に空白を挿入することもできます (いくつかの制限があります)。空白については、本ドキュメントの "構文規則" の章で説明しています。
ほとんどの ObjectScript のコマンド (および関数や特殊変数) には、長い形式と短い (省略された) 形式 (通常は 1、2 文字) があります。例えば、次のプログラムは前述のプログラムと同じものですが、コマンド名が省略された形で使用されています。
S x="World"
W "Hello",!,x
短い形式のコマンド名は、長いコマンド名の入力を好まない開発者が使用する 1 つの手段です。長い形式とまったく同じコマンドを示します。このドキュメントでは、長い形式のコマンド名を使用します。完全なリストは、"ObjectScript で使用する省略形" を参照してください。
コマンドの詳細は、"コマンド"、あるいは "ObjectScript リファレンス" のそれぞれのリファレンス・ページを参照してください。
関数
関数とは、処理 (例えば、文字列をその等価の ASCII コード値に変換するなど) を実行して値を返すコードのことです。関数は、コマンド行内で呼び出されます。この呼び出しにより関数にパラメータ値が渡され、このパラメータ値を使用して処理を実行します。次に関数は単一の値 (結果) を呼び出し元コマンドに返します。式 を使用できる場所ならどこでも関数を使用できます。
InterSystems IRIS では、大量のシステム指定の関数 (“内部” 関数とも呼ばれる) を提供しており、これらを変更することはできません。これらの関数は、1 つのドル記号 (“$”) で始まり、パラメータが括弧で囲まれているため、識別可能です。パラメータが指定されない場合でも、括弧は必須です (特殊変数名も単一のドル記号で始まりますが、括弧は含まれません)。
多くのシステム指定の関数名には、省略形があります。このドキュメントでは、完全な関数名が使用されます。省略形は関数のリファレンス・ページに示され、"ObjectScript で使用する省略形" には完全なリストが用意されています。
関数は常に値を返します。通常、返り値はコマンドに渡され、SET namelen=$LENGTH("Fred Flintstone") または WRITE $LENGTH("Fred Flintstone") のようになるか、あるいは別の関数に指定されて WRITE $LENGTH($PIECE("Flintstone^Fred","^",1)) のようになります。返り値の受取先を指定しないと、通常 <SYNTAX> エラーが発生します。ただし、一部の関数では、返り値の受取先を指定することは必須ではありません。関数の実行によって行われる処理 (ポインタの移動など)、または関数のパラメータの 1 つを設定することは、関連する処理です。このような場合、DO または JOB コマンドを使用して、返り値を受け取らずに関数を呼び出すことができます。例えば、DO $CLASSMETHOD(clname,clmethodname,singlearg) のように指定します。
関数には、1 つのパラメータまたは複数のパラメータを指定することも、パラメータを指定しないこともできます。関数のパラメータは定位置にあり、コンマで区切られます。多くのパラメータはオプションです。パラメータを省略する場合、InterSystems IRIS はそのパラメータの既定値を使用します。パラメータは定位置のため、指定されたパラメータのリスト内でパラメータを通常省略することはできません。場合によっては ($LISTTOSTRING など)、パラメータのリスト内でパラメータを省略し、プレースホルダのコンマを指定できます。オプションのパラメータについては、最後の指定されたパラメータの右側にプレースホルダのコンマを指定する必要はありません。
大半の関数は、同じパラメータを繰り返して指定できません。しかし、$CASE、$CHAR、$SELECT は例外として使用できます。
一般的に、パラメータはリテラル、変数、または別の関数の返り値として指定できます。パラメータをリテラルとして指定しなければいけない場合もあります。ほとんどの場合、関数パラメータとして指定するには、変数をまず定義する必要があります。そうしないと、<UNDEFINED> エラーが発生します。一部のケースでは ($DATA など)、パラメータ変数を定義しなくてもよい場合があります。
一般的に、関数パラメータは関数に値を指定する入力パラメータです。関数は入力パラメータとして指定された変数の値を変更しません。関数は値を返すと共に出力パラメータを設定する場合もあります。例えば、$LISTDATA は、指定された位置にリスト要素があるかどうかを示すブーリアン値を返します。また、(オプションで) リスト要素の値に対して 3 番目のパラメータを設定します。
すべての関数は SET コマンド (SET x=$LENGTH(y) など) の右側で指定できます。一部の関数は SET コマンドの左側でも指定できます (SET $LIST(list,position,end)=x など)。SET の左側で指定可能な関数は、参照ページの構文ブロックでそのように識別されます。
システム指定の関数は、InterSystems IRIS の一部として提供されます。"ObjectScript ランゲージ・リファレンス" では、システム指定の関数のそれぞれについて説明しています。クラスで提供される関数はメソッドと呼ばれます。InterSystems IRIS で提供されるメソッドについては、"インターシステムズ・クラス・リファレンス" で説明されています。
システム関数の他に、ObjectScript は ユーザ定義関数 (“外部” 関数ともいいます) もサポートします。また、ユーザ定義関数の定義と呼び出しの詳細は、"ユーザ定義コード" を参照してください。
式
式は、1 つの値を算出するために評価されるトークン一式です。例えば、リテラル文字列 “hello” は式です。また l + 2 も式です。x などの変数、$LENGTH などの関数、$ZVERSION などの特殊変数も式として評価されます。
プログラムでは、式をコマンドや関数の引数として使用します。
SET x = "Hello"
WRITE x,!
WRITE 1 + 2,!
WRITE $LENGTH(x),!
WRITE $ZVERSION
変数
ObjectScript で変数は、実行時の値が格納される場所の名前です。変数は、SET コマンドなどで定義する必要がありますが、決まった形式は必要ありません。ObjectScript の変数に決まった形式はありません。つまり、変数にはデータ型が割り当てられていないため、任意のデータ値を取ることができます (互換性を維持するために、$DOUBLE 関数を使用して、形式の決まっていない浮動小数点数を特定の数値データ型形式に変換できます)。
ObjectScript は、さまざまな種類の変数をサポートします。
-
ローカル変数 — 変数を作成した InterSystems IRIS プロセスからのみアクセス可能でプロセス終了時に自動的に削除される変数。ローカル変数にはどのネームスペースからでもアクセスできます。
-
プロセス・プライベート・グローバル — InterSystems IRIS プロセスからのみアクセス可能でプロセス終了時に削除される変数。プロセス・プライベート・グローバルには、どのネームスペースからでもアクセスできます。プロセス・プライベート・グローバルは、サイズの大きいデータ値を一時的に格納する場合に特に便利です。
-
グローバル — InterSystems IRIS データベースに格納される永続変数。グローバルは、すべてのプロセスからアクセス可能であり、そのグローバルを作成したプロセスが終了しても存続します。グローバルは、各ネームスペースに固有です。
-
配列変数 — 1 つあるいはそれ以上の添え字を持つ変数。すべてのユーザ定義変数は、ローカル変数、プロセス・プライベート・グローバル、グローバル、オブジェクト・プロパティを含め配列として使用されます。
-
特殊変数 (システム変数とも呼ばれる) — InterSystems IRIS 操作環境における特定の状況の値を含む組み込み変数一式の 1 つ。すべての特殊変数は定義されます。InterSystems IRIS では、すべての特殊変数を初期値 (場合によっては NULL 文字列値) に設定します。特殊変数にはユーザが設定できるものと、InterSystems IRIS でのみ設定できるものがあります。特殊変数は配列変数ではありません。
-
オブジェクト・プロパティ — オブジェクトの特定のインスタンスに関連し、格納される値。
ObjectScript は、変数に対する、あるいは変数間でのさまざまな処理をサポートします。変数については、"変数" を参照してください。
演算子
ObjectScript は、多くの組み込み演算子を定義します。演算子には、算術演算子、論理演算子、パターン・マッチ演算子などがあります。詳細は "演算子と式" を参照してください。