データ型とデータ値
ObjectScript は、タイプのない言語です (変数タイプを宣言する必要はありません)。変数は、文字列、数値、オブジェクト値を持つことができます。それでも ObjectScript では、異種データをいつ使用するかを把握しておくことは重要な情報となります。
文字列
文字列とは、文字、数字、句読点などの文字の組み合わせを、1 組の引用符 (") で囲んだものです。
SET string = "This is a string"
WRITE string
文字列についての項目は以下のとおりです。
"文字列長の制限" を参照してください。
NULL 文字列と $CHAR(0)
-
SET mystr="" : NULL または空の文字列を設定します。文字列が定義され、ゼロの長さで、データは含まれません。
SET mystr="" WRITE "defined:",$DATA(mystr),! WRITE "length: ",$LENGTH(mystr),! ZZDUMP mystr
-
SET mystr=$CHAR(0) : 文字列を NULL 文字に設定します。文字列が定義され、1 の長さで、16 進数値 00 の 1 文字が含まれます。
SET mystr=$CHAR(0) WRITE "defined:",$DATA(mystr),! WRITE "length: ",$LENGTH(mystr),! ZZDUMP mystr
これら 2 つの値は同じではないことに注意してください。ただし、ビット文字列ではこれらの値は同一のものとして処理されます。
InterSystems SQL では、これらの値が独自の方法で解釈されます。"NULL および空文字列" を参照してください。
引用符のエスケープ
" (二重引用符) 文字の前にもう 1 つ " 文字を置くと、文字列内のリテラルとして引用符を組み込むことができます。
SET string = "This string has ""quotes"" in it."
WRITE string
ObjectScript 文字列リテラルに、他のエスケープ文字シーケンスはありません。
リテラルの引用符は、その他のインターシステムズのソフトウェアでは、別のエスケープ・シーケンスを使用して指定されます。これに該当するエスケープ・シーケンスについての表は、$ZCONVERT 関数を参照してください。
連結文字列
連結演算子を使用して、2 つの文字列を 1 つに結合できます。
SET a = "Inter"
SET b = "Systems"
SET string = a_b
WRITE string
連結演算子を使用して、出力不能文字を文字列に組み込むことができます。以下の文字列には、改行 ($CHAR(10)) 文字が含まれています。
SET lf = $CHAR(10)
SET string = "This"_lf_"is"_lf_"a string"
WRITE string
出力不能文字の表示方法は、ディスプレイ・デバイスにより決定されます。例えば、ターミナルとブラウザでは、改行文字や他のポジショニング文字の表示方法が異なります。さらに、ブラウザが異なれば、ポジショニング文字 $CHAR(11) および $CHAR(12) の表示方法も異なります。
InterSystems IRIS エンコード文字列 (ビット文字列、リスト構造文字列、JSON 文字列) には、連結演算子の使用に関する制限があります。詳細は、"連結エンコード文字列" を参照してください。
数値を結合する際は、他の事項も考慮する必要があります。詳細は、“数字の連結” を参照してください。
文字列比較
等号 (=) および不等号 ('=) の演算子を使用して、2 つの文字列を比較できます。文字列の等値比較では大文字と小文字が区別されます。これらの演算子を使用して、文字列を数字と比較する際には注意が必要です。それは、この比較が文字列比較であり、数値比較ではないからです。したがって、キャノニック形式の数字を含む文字列のみが、対応する数字と等価になります。("-0" はキャノニック形式の数ではありません。)詳細は、以下の例を参照してください。
WRITE "Fred" = "Fred",! // TRUE
WRITE "Fred" = "FRED",! // FALSE
WRITE "-7" = -007.0,! // TRUE
WRITE "-007.0" = -7,! // FALSE
WRITE "0" = -0,! // TRUE
WRITE "-0" = 0,! // FALSE
WRITE "-0" = -0,! // FALSE
<、>、<=、>= などの演算子を使用して、文字列比較を実行することはできません。これらの演算子は数値として文字列を扱い、常に数値比較を実行します。非数値文字列は、これらの演算子を使用して比較された場合、いずれも数値 0 が割り当てられます。
大文字小文字の区別と文字列比較
文字列の等値比較では大文字と小文字が区別されます。$ZCONVERT 関数を使用すれば、比較する文字列の文字をすべて大文字に、またはすべて小文字に変換することができます。文字ではない符号や記号は不変となります。
小文字の文字形式しか有していない文字も多少あります。例えば、ドイツ語の eszett ($CHAR(223)) は小文字としてのみ定義されます。これを大文字に変換しても、結果は同じ小文字となります。これにより、英数字文字列を大文字または小文字のみの文字列に変換する場合は、常に小文字に変換することをお勧めします。
ビット文字列
ビット文字列は、番号付きビットとブーリアン値の論理セットを表します。文字列内のビットには、ビット番号 1 から始まる番号が付けられます。ブーリアン値 1 に明示的に設定されていない番号付きビットは、0 と評価されます。したがって、明示的に設定された番号付きビット以外のものを参照すると、ビット値 0 が返されます。
ビット文字列には論理長があります。これは、0 または 1 のいずれかに明示的に設定された最上位のビット位置です。この論理長には、$BITCOUNT 関数を使用することでのみアクセスできます。ただし、通常は、アプリケーション・ロジックでは論理長を使用しないでください。ビット文字列関数の場合、未定義のグローバル変数またはローカル変数は、ビット値 0 を返す指定された番号付きビットを持ち、$BITCOUNT 値 が 0 であるビット文字列と同等です。
ビット文字列は、内部形式を持つ通常の ObjectScript 文字列として保存されます。この内部文字列の表現には、ビット文字列関数ではアクセスできません。この内部形式のため、ビット文字列の文字列長は、文字列内のビット数に関する情報を判断する際に意味がありません。
ビット文字列の内部形式という理由により、連結演算子をビット文字列と共に使用することはできません。これを実行しようとすると、<INVALID BIT STRING> エラーが返されます。
同じ状態 (同じブーリアン値を持つ) の 2 つのビット文字列が、異なる内部文字列表現を持つ場合があります。したがって、文字列表現は、アプリケーション・ロジックで調査したり、比較したりしないでください。
ビット文字列関数の場合、未定義の変数として指定されたビット文字列は、すべてのビットが 0 で長さが 0 のビット文字列と同等です。
通常の文字列とは異なり、ビット文字列では、空の文字列と文字 $CHAR(0) は互いに等しく、0 ビットを表すものとして処理されます。これは、$BIT では非数値の文字列がすべて 0 として処理されるからです。したがって、以下のようになります。
SET $BIT(bstr1,1)=""
SET $BIT(bstr2,1)=$CHAR(0)
SET $BIT(bstr3,1)=0
IF $BIT(bstr1,1)=$BIT(bstr2,1) {WRITE "bitstrings are the same"} ELSE {WRITE "bitstrings different"}
WRITE $BITCOUNT(bstr1),$BITCOUNT(bstr2),$BITCOUNT(bstr3)
トランザクション中にグローバル変数で設定されたビットは前の値に戻され、その後にトランザクションのロールバックが行われます。ただし、グローバル変数のビット文字列は、ロールバック操作によって前の文字列長または前の内部文字列表現に戻りません。ローカル変数は、ロールバック操作によって元に戻りません。
論理ビットマップ構造は、ビット文字列の配列で表現できます。この配列の各要素が固定のビット数を持つ 1 つの「チャンク」を表しています。未定義はすべてのビットが 0 のチャンクと同等であるため、配列はスパースになることがあります。すべてのビットが 0 のチャンクを表す配列要素は、存在している必要は一切ありません。この理由および上記のロールバック動作のため、アプリケーション・ロジックでは、ビット文字列の長さや $BITCOUNT(str) または $BITCOUNT(str,0) を使用してアクセスできる 0 値のビットのカウントに依存しないようにする必要があります。
数値
数値に関連するトピックは、以下のとおりです。
数値の基本
数値リテラルに句読点は必要ありません。任意の有効な数値文字を使用して数を指定できます。InterSystems IRIS では、数値が構文的に有効と評価されると、その数値がキャノニック形式に変換されます。
数値リテラルの構文要件は以下のようになります。
-
0 ~ 9 の 10 進数を含むことができ、少なくともそれらの数値文字のいずれかを含んでいること。先頭または末尾にゼロを使用できます。ただし、InterSystems IRIS で数値をキャノニック形式に変換すると、先頭の整数ゼロが自動的に削除されます。このため、先頭の整数ゼロが重要な数値は、文字列として入力する必要があります。例えば、米国の郵便番号は、02142 のように先頭が整数ゼロの可能性もあるため、数値ではなく文字列として処理する必要があります。
-
任意のシーケンスで、先頭に任意の数のプラス符号とマイナス符号を使用できます。ただし、プラス符号とマイナス符号は、科学的記数法の文字 “E” を除き、他の任意の文字の後に位置することはできません。数値式では、非符号文字の後の符号は加算または減算として評価されます。数値文字列では、非符号文字の後の符号は非数値文字として評価され、そこで文字列の数値部が終わります。
InterSystems IRIS では、PlusSign および MinusSign プロパティ値を現在のロケールに使用して、これらの符号文字 (既定では “+” および “-”) を決定します。これらの符号文字はロケールに依存します。ユーザのロケールの PlusSign 文字および MinusSign 文字を決定するには、以下のように GetFormatItem()Opens in a new tab メソッドを呼び出します。
WRITE ##class(%SYS.NLS.Format).GetFormatItem("PlusSign"),! WRITE ##class(%SYS.NLS.Format).GetFormatItem("MinusSign")
-
小数点区切り文字を 1 つ使用できます。数値式では、2 つ目の小数点区切りを用いると <SYNTAX> エラーとなります。数値文字列では、2 つ目の小数点区切りは最初の非数値文字として評価され、そこで文字列の数値部が終わります。小数点区切り文字は、数値式の最初の文字または最後の文字となることができます。小数点区切り文字の選択はロケールに依存します。アメリカ形式では、小数点区切りとして既定のピリオド (.) が使用されます。ヨーロッパ形式では、コンマ (,) が使用されます。ユーザのロケールの DecimalSeparator 文字を決定するには、以下のように GetFormatItem()Opens in a new tab メソッドを呼び出します。
WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
-
科学的記数法では、“E” (または “e”) を最大で 1 つ使用して 10 を基数とする指数を指定できます。この科学的記数文字 (“E” または “e”) の前には整数または小数、その後には整数を記述する必要があります。
数値リテラル値は、以下をサポートしていません。
-
数値グループ・セパレータは使用できません。これらはロケールに依存します。アメリカ形式ではコンマが使用され、ヨーロッパ形式ではピリオドが使用されます。$INUMBER 関数を使用して数値グループ・セパレータを削除し、$FNUMBER 関数を使用して数値グループ・セパレータを追加することができます。
-
通貨記号、16 進数文字、その他の非数値文字は使用できません。演算子の前後を除き、空白スペースは使用できません。
-
末尾にプラス符号やマイナス符号を使用できません。ただし、$FNUMBER 関数は、末尾に符号の付いた文字列として数を表示でき、$NUMBER 関数でこの形式の文字列を取得して、先頭に符号の付いた数に変換します。
-
負の数 (借方) として数を表す場合、括弧に入れることはできません。ただし、$FNUMBER 関数は、括弧で囲んだ文字列で負の数を表示でき、$NUMBER 関数でこの形式の文字列を取得して、先頭に負符号の付いた数に変換します。
数または数値式には、1 組みの括弧を使用できます。これらの括弧は数の一部ではありませんが、処理の優先順位を決定します。既定では、InterSystems IRIS は、厳密に左から右の順序ですべての処理を実行します。
数値のキャノニック形式
ObjectScript では、数に対する数値演算のすべてをキャノニック形式で実行します。例えば、数値 +007.00 の長さは 1 になり、文字列 "+007.00" の長さは 7 になります。
InterSystems IRIS で数をキャノニック形式に変換するときには、以下の手順が実行されます。
-
科学的記数法の指数が解決されます。例えば、3E4 は 30000 に変換され、3E-4 は .0003 に変換されます。
-
先頭の符号が解決されます。まず、複数の符号が 1 つの符号に解決されます (例えば、2 つのマイナス符号が 1 つのプラス符号になります)。次に、先頭にあるプラス符号が削除されます。$FNUMBER 関数を使用すると、InterSystems IRIS のキャノニック形式の正の数にプラス記号を明示的に指定 (追加) できます。
Note:ObjectScript は、先頭のプラス記号とマイナス記号の任意の組み合わせを解決します。SQL では、2 つの連続したマイナス記号は、1 行コメント文字として解析されます。したがって、先頭に 2 つの連続したマイナス記号を付けて SQL で数値を指定すると、SQLCODE -12 エラーになります。
-
先頭と末尾のゼロがすべて削除されます。これには、1 より小さい小数の先頭の整数ゼロの削除も含まれます。例えば、0.66 は .66 になります。
-
キャノニック形式の小数に整数のゼロを追加するには、$FNUMBER 関数または $JUSTIFY 関数を使用します。.66 は 0.66 になります。
-
キャノニック形式以外の小数から整数ゼロを削除するには、単項プラス演算子を使用して、数値文字列からキャノニック形式の数値への変換を行います。例えば、+$PIECE("65798,00000.66",",",2) のタイムスタンプの秒の小数部00000.66 は .66 になります。
この変換の一環として、ゼロの小数は 0 に単純化されます。表現方法 (0.0、.0、.000) にかかわらず、すべてのゼロ値は 0 に変換されます。
-
-
末尾の小数点区切りが削除されます。
-
-0 は 0 に変換されます。
-
算術演算と数値の連結が実行されます。InterSystems IRIS は、こうした演算を厳密に左から右の順に実行します。このような演算は、キャノニック形式の数で実行されます。詳細は、後述の "数字の連結" を参照してください。
InterSystems IRIS のキャノニック形式の数は、その他のインターシステムズのソフトウェアで使用されているキャノニック形式の数とは異なります。
-
ODBC: 整数ゼロの小数は、1 つのゼロ整数を含む ODBC に変換されます。そのため、.66 と 000.66 は、どちらも 0.66 になります。$FNUMBER 関数または $JUSTIFY 関数を使用すると、InterSystems IRIS のキャノニック形式の小数に整数のゼロを追加できます。
-
JSON:先頭の 1 つのマイナス記号のみが許容されます。先頭のプラス記号や複数の記号は許容されません。
指数は許容されますが、解決されません。3E4 は、3E4 として返されます。
先頭のゼロは許容されません。末尾のゼロは削除されません。
整数ゼロの小数には、1 つのゼロ整数が必要です。したがって、.66 と 000.66 は無効な JSON の数値になりますが、0.66 と 0.660000 は有効な JSON の数値となります。
末尾の小数点記号は許容されません。
ゼロの値は、変換されません。0.0、-0、および -0.000 は、有効な JSON の数値として変更なしで返されます。
数値としての文字列
文字列を数値として処理する標準的な規則は以下のとおりです。詳細は、"文字列から数値への変換" を参照してください。特別な処理については、"非常に大きな数値文字列" を参照してください。
-
すべての数値演算では、キャノニック形式の数字を含む文字列が、対応する数字と機能的に同一になります。例えば、"3" = 3、"-2.5" = -2.5 となります。(-0 はキャノニック形式の数ではありません。)
-
算術演算では、非キャノニック形式の数値文字のみを含む文字列が、対応する数字と機能的に同一になります。例えば、"003" + 3 = 6、"++-2.5000" + -2.5 = -5 となります。
-
「より大きい/より小さい」などの比較演算では、非キャノニック形式の数値文字のみを含む文字列が、対応する数字と機能的に同一になります。例えば、次の文は True となります。"003" > 2、"++-2.5000" >= -2.5
-
等値演算 (=、'=) では、非キャノニック形式の数値文字のみを含む文字列が、数値ではなく文字列として扱われます。例えば、次の文は True となります。"003" = "003"、"003" '= 3、"+003" '= "003"
数値としての文字列の解析に関するその他のガイドラインを以下に述べます。
-
混合数値文字列とは、数字で始まり、1 つまたは複数の数値でない文字が続く文字列です。例えば “7 dwarves” です。InterSystems IRIS の数値演算とブーリアン演算 (等値演算は除く) では共に、数値ではない文字を検出するまで混合数値文字列を数値として解析します。数値でない文字を検出した時点で残りの文字列を無視します。以下に混合数値文字列の算術演算の例を示します。
WRITE "7dwarves" + 2,! // returns 9 WRITE "+24/7" + 2,! // returns 26 WRITE "7,000" + 2,! // returns 9 WRITE "7.0.99" + 2,! // returns 9 WRITE "7.5.99" + 2,! // returns 9.5
-
非数値文字列とは、数値文字の前に数値ではない文字がある任意の文字列です。空白は数値ではない文字と見なされます。InterSystems IRIS の数値演算とブーリアン演算 (等値演算は除く) では共に、このような文字列を数値 0 (ゼロ) を持つものとして解析します。以下に非数値文字列の算術演算の例を示します。
WRITE "dwarves 7" + 2,! // returns 2 WRITE "+ 24/7" + 2,! // returns 2 WRITE "$7000" + 2,! // returns 2
-
文字列の接頭語にプラス符号を置いて、等値演算の数値として評価させることができます。数値文字列はキャノニック形式の数値として解析され、非数値文字列は 0 として解析されます。(マイナス符号の接頭語でも等値演算の数値として文字列を評価されます。当然、マイナス符号は 0 以外の値の符号の反転となります。) 以下では、プラス符号により等値演算での数値評価が強制される例を示します。
WRITE +"7" = 7,! // returns 1 (TRUE) WRITE +"+007" = 7,! // returns 1 (TRUE) WRITE +"7 dwarves" = 7,! // returns 1 (TRUE) WRITE +"dwarves" = 0,! // returns 1 (TRUE) WRITE +"" = 0,! // returns 1 (TRUE)
"ObjectScript リファレンス" に示したとおり、個別のコマンドと関数に対する数値文字列の例外処理は共通となります。
非常に大きな数値文字列
通常、数値文字列は ObjectScript の 10 進数値に変換されます。ただし、非常に大きな数値の場合 (9223372036854775807E127 より大きい)、常に数値文字列を 10 進数値に変換できるとは限りません。数値文字列を 10 進数値に変換すると <MAXNUMBER> エラーが発生する場合、InterSystems IRIS では代わりに IEEE バイナリ値に変換します。InterSystems IRIS は次の操作を実行して、数値文字列を数に変換します。
-
数値文字列を 10 進数の浮動小数点数に変換します。この操作で <MAXNUMBER> エラーが発生する場合は、手順 2 に進みます。それ以外の場合、10 進数値がキャノニック形式の数として返されます。
-
$SYSTEM.Process.TruncateOverflow()Opens in a new tab メソッド・ブーリアン値を確認します。0 (既定) の場合、手順 3 に進みます。それ以外の場合、オーバーフローする 10 進数値が返されます (メソッドの説明を参照)。
-
数値文字列を IEEE バイナリ浮動小数点数に変換します。この操作で <MAXNUMBER> エラーが発生する場合は、手順 4 に進みます。それ以外の場合、IEEE バイナリ値がキャノニック形式の数として返されます。
-
$SYSTEM.Process.IEEEError()Opens in a new tab メソッド・ブーリアン値を確認します。この値に応じて、INF / -INF が返されるか、<MAXNUMBER> エラーが発生します。
数字の連結
連結演算子 (_) を使用して、ある数と別の数を連結できます。InterSystems IRIS は、まずそれぞれの数値をキャノニック形式に変換してから、その結果に対して文字列連結を実行します。したがって、12_34、12_+34、12_--34、12.0_34、12_0034.0、12E0_34 はすべて 1234 になります。12._34 の連結は 1234 になりますが、12_.34 は 12.34 になります。12_-34 の連結は文字列 “12-34” になります。
InterSystems IRIS は、キャノニック形式に変換した後の数に対して、数値の連結と算術演算を実行します。こうした演算は厳密に左から右の順に実行されます。ただし、演算の優先順位を決める括弧が指定されている場合を除きます。以下の例では、この結果について説明しています。
WRITE 7_-6+5 // returns 12
この例では、連結によって文字列 "7-6" が返されます。これが、キャノニック形式の数でないことは明白です。InterSystems IRIS は、最初の非数値文字 (埋め込みのマイナス記号) を切り捨てることで、この文字列をキャノニック形式の数に変換します。その後で、このキャノニック形式の数を使用して次の演算 7 + 5 = 12 を実行します。
浮動小数点数
InterSystems IRIS は、浮動小数点数を表すために使用できる 2 つの異なる数値タイプをサポートしています。
-
10 進数の浮動小数点 : 既定では、InterSystems IRIS は、固有の 10 進数の浮動小数点標準 ($DECIMAL 数) を使用して小数を表します。これは、ほとんどの場合の優先形式であり、IEEE バイナリ浮動小数点よりも、高いレベルの精度が得られます。これは、InterSystems IRIS がサポートしているすべてのシステム・プラットフォームで一貫しています。10 進数の浮動小数点は、データ・ベースの値で優先的に使用されます。特に、0.1 などの小数は、10 進数の浮動小数記数法を使用して正確に表現できますが、小数 0.1 (およびほとんどの 10 進数の小数) は IEEE バイナリ浮動小数点では近似値で表現できるだけです。
内部的に、10 進算術は M*(10**N) 形式の数を使用して実行されます。M は -9223372036854775808 から 9223372036854775807 の整数値を含む整数の仮数で、N は -128 から 127 の整数値を含む 10 進指数です。仮数は 64 ビット符号付整数で表され、指数は 8 ビット符号付バイトで表されます。
10 進浮動小数点の平均精度は小数桁数 18.96 桁です。仮数が 1000000000000000000 から 9223372036854775807 の小数の精度は正確に 19 桁で、922337203685477581 から 999999999999999999 の有効な小数の精度は正確に 18 桁です。IEEE バイナリ浮動小数点は、精度は低いものの (精度は小数桁数約 15.95 桁)、小数文字列としての IEEE バイナリ表現の正確な無限精度の値は、1000 桁以上の有効小数桁数を持つことができます。
以下の例では、$DECIMAL 関数は小数と 25 桁の整数を取り、19 桁の精度/有効桁数に丸められた小数を返します。
USER>WRITE $DECIMAL(1234567890.123456781818181) 1234567890.123456782 USER>WRITE $DECIMAL(1234567890123456781818181) 1234567890123456782000000
-
IEEE バイナリ浮動小数点 : IEEE 倍精度バイナリ浮動小数点は、小数を表現する業界標準の方法です。IEEE 浮動小数点数は、バイナリ表現でエンコードされます。バイナリ浮動小数点表現は、ほとんどのコンピュータがバイナリ浮動小数点演算のための高速ハードウェアを搭載しているため、通常、高速計算を実行する場合に優先的に使用されます。
内部的に、IEEE バイナリ算術は S*M*(2**N) 形式の数を使用して実行されます。S は -1 または +1 の値を含む符号で、M は 1 番目と 2 番目のバイナリ・ビット間に 2 進小数点がある 53 ビットのバイナリ小数値を含む仮数で、N は -1022 から 1023 の整数値を含む 2 進指数です。このため、表現は 64 ビットで構成されます。S は 1 つの符号ビット、指数 N は次の 11 ビットに格納され (2 つの追加の値が予約されます)、仮数 M は >=1.0 かつ <2.0 で最後の 52 ビットを含み、合計 53 バイナリ・ビットの精度となります。(M の最初のビットは常に 1 であるため、64 ビット表現に出現する必要はありません。)
倍精度バイナリ小数点の精度は 53 バイナリ・ビットで、小数点以下約 15.95 桁の精度に相当します。(対応する 10 進数の精度は 15.35 から 16.55 桁の間で変動します。)
バイナリ表現は、0.1 などの小数をバイナリ小数の有限シーケンスとして表現できないため、10 進数の小数と正確には一致しません。ほとんどの小数はこのバイナリ表現では正確に表すことができないため、IEEE 浮動小数点数は対応する InterSystems の 10 進浮動小数点数とは若干異なる場合があります。IEEE 浮動小数点数が小数として表示されるとき、バイナリ・ビットが18 桁を大幅に超える小数桁数の小数に変換されることがよくあります。これは、IEEE 浮動小数点数が InterSystems の 10 進浮動小数点数より精度が高いことを意味するわけではありません。IEEE 浮動小数点数は、InterSystems の10 進数よりも大きい数および小さい数を表現できます。
以下の例では、$DOUBLE 関数は 17 桁の整数のシーケンスを取り、小数点以下の有効桁数約 16 桁の値を返します。
USER>FOR i=12345678901234558:1:12345678901234569 {W $DOUBLE(i),!} 12345678901234558 12345678901234560 12345678901234560 12345678901234560 12345678901234562 12345678901234564 12345678901234564 12345678901234564 12345678901234566 12345678901234568 12345678901234568 12345678901234568
IEEE バイナリ浮動小数点は、特殊な値 INF (無限大) と NAN (非数値) をサポートします。詳細は、"$DOUBLE" 関数を参照してください。
INF および NAN 値を扱うための IEEEError 設定と、$LIST 構造データ内の IEEE 浮動小数点数の圧縮を扱うための ListFormat 設定を使用して、IEEE 浮動小数点数の処理を構成できます。どちらも、%SYSTEM.ProcessOpens in a new tab クラス・メソッド $SYSTEM.Process.IEEEError()Opens in a new tab を使用して、現在のプロセスに表示および設定できます。InterSystems IRIS の管理ポータルで [システム管理] から [構成]、[追加の設定]、[互換性] を選択して、システム全体の既定値を設定できます。
$DOUBLE 関数を使用して、InterSystems IRIS 標準の浮動小数点数を IEEE 浮動小数点数に変換できます。また、$DECIMAL 関数を使用して、IEEE 浮動小数点数を InterSystems IRIS 標準の浮動小数点数に変換できます。
既定では、InterSystems IRIS は小数をキャノニック形式に変換して、先頭のゼロをすべて削除します。したがって、0.66 は .66 となります。$FNUMBER (ほとんどの形式) および $JUSTIFY (3 パラメータ形式) は常に、最低 1 桁の整数を伴う小数を返します。これらの関数のいずれかを使用した場合、.66 は 0.66 となります。
$FNUMBER および $JUSTIFY を使用すれば、指定した小数桁数に対して丸めや埋め込みを行うことができます。InterSystems IRIS では、5 以上を切り上げて、4 以下を切り捨てます。埋め込みでは、ゼロを必要な小数桁だけ追加します。少数を整数に丸めた場合、小数点区切り文字は削除されます。整数をゼロ・パディングして小数にした場合、小数点区切り文字が追加されます。
科学的記数法
ObjectScript で科学的記数法 (指数表現) を指定するには、以下の形式を使用します。
[-]mantissaE[-]exponent
各項目の内容は次のとおりです。
要素 | 説明 |
---|---|
- | オプション — 1 つ以上の単項マイナス演算子または単項プラス演算子。これらのマイナス記号文字とプラス記号文字は構成可能です。キャノニック形式への変換では、科学的記数法を解決した後にこれらの演算子が解決されます。 |
mantissa | 整数または小数。先頭と末尾のゼロおよび末尾の小数点区切り文字が含まれる場合があります。 |
E | 指数表現を区切る演算子。大文字の “E” は標準の指数演算子です。小文字の “e” は、%SYSTEM.ProcessOpens in a new tab クラスの ScientificNotation() メソッドを使用して構成できる指数演算子です。 |
- | オプション — 単一の単項マイナス演算子または単項プラス演算子。負数の指数を指定するために使用できます。これらのマイナス記号文字とプラス記号文字は構成可能です。 |
exponent | 指数 (10 のべき乗値) を指定する整数。先頭にゼロを使用できます。小数点区切り文字は記述できません。 |
例えば、10 を表現するには 1E1、2800 を表現するには 2.8E3、0.05 を表現するには 5E-2 と記述します。
mantissa、E、およびexponent の間には、スペースは許可されません。この構文内では、括弧、連結、およびその他の演算子は許可されません。
科学的記数法を解決することが、数値をキャノニック形式に変換する第一歩であるため、一部の変換処理は利用できません。mantissa と exponent は数値リテラルである必要があり、変数または算術式にすることはできません。exponent は、(最大でも) 1 つのプラスまたはマイナス記号の付いた整数である必要があります。
詳細は、%SYSTEM.ProcessOpens in a new tab クラスの ScientificNotation()Opens in a new tab メソッドの説明を参照してください。
極端に大きな数字
正確に表現できる最大の整数は、19 桁の整数の -9223372036854775808 と 9223372036854775807 です。なぜなら、これらの数値は 64 ビット符号付き整数で表現できる最大数だからです。これを超える整数は、この 64 ビット制限に収まるように自動的に丸められます。以下に例を示します。
SET x=9223372036854775807
WRITE x,!
SET y=x+1
WRITE y
同様に、128 を超える指数も、64 ビット符号付き整数の表現になるように自動的に丸められます。以下に例を示します。
WRITE 9223372036854775807e-128,!
WRITE 9223372036854775807e-129
この丸めにより、19 桁の整数を超える数になる算術演算は、下位の桁がゼロに置き換えられます。これにより、以下のような状況となる可能性があります。
SET longnum=9223372036854775790
WRITE longnum,!
SET add17=longnum+17
SET add21=longnum+21
SET add24=longnum+24
WRITE add17,!,add24,!,add21,!
IF add24=add21 {WRITE "adding 21 same as adding 24"}
InterSystems IRIS でサポートされる最大の 10 進数の浮動小数点数は 9.223372036854775807E145 です。サポートされる最大の $DOUBLE 値 (INFINITY への IEEE オーバーフローが無効であると想定) は 1.7976931348623157081E308 です。$DOUBLE 型は、InterSystems IRIS の 10 進数型よりも広い範囲の値をサポートしますが、InterSystems IRIS の 10 進数型の方が高精度をサポートします。InterSystems IRIS の 10 進数型の精度は約 18.96 桁 (普通は 19 桁ですが、時折 18 桁の精度) で、$DOUBLE 型の通常の精度は約 15.95 桁 (53 バイナリ桁) です。既定では、InterSystems IRIS は数値リテラルを 10 進数の浮動小数点数として表現します。ただし、数値リテラルが InterSystems IRIS の 10 進数で表現できる数値より大きい場合 (9.223372036854775807E145 より大きい場合)、InterSystems IRIS はその数値を $DOUBLE 表現に自動的に変換します。
1.7976931348623157081E308 (308 桁または 309 桁) より大きな数値の場合、<MAXNUMBER> エラーが発生します。
10 進数の浮動小数点からバイナリ浮動小数点への自動変換のため、丸めの動作は、9.223372036854775807E145 (整数に応じて 146 桁または 147 桁) で変更されます。詳細は、以下の例を参照してください。
TRY {
SET a=1
FOR i=1:1:310 {SET a=a_1 WRITE i+1," digits = ",+a,! }
}
CATCH exp { WRITE "In the CATCH block",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: "
}
ELSE { WRITE "Some other type of exception",! RETURN }
WRITE exp.Code,!
WRITE "Data: ",exp.Data,!
RETURN
}
TRY {
SET a=9
FOR i=1:1:310 {SET a=a_9 WRITE i+1," digits = ",+a,! }
}
CATCH exp { WRITE "In the CATCH block",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: "
}
ELSE { WRITE "Some other type of exception",! RETURN }
WRITE exp.Code,!
WRITE "Data: ",exp.Data,!
RETURN
}
309 桁より大きな数値は数値文字列として表現できます。この値は数値ではなく文字列として保存されるため、丸めも <MAXNUMBER> エラーも適用されません。
SET a="1"
FOR i=1:1:360 {SET a=a_"1" WRITE i+1," characters = ",a,! }
許可される最大桁数を超える数値になる指数は、<MAXNUMBER> エラーを生成します。指数の最大許容数は、その指数を受け入れる数のサイズによって異なります。1 桁の仮数の場合、最大指数は 307 または 308 です。
InterSystems IRIS の小数または IEEE 倍精度数を使用する際の大きな数字に関する考慮事項の詳細は、"インターシステムズ・アプリケーションでの数値の計算" を参照してください。
オブジェクト
オブジェクト値は、メモリ内のオブジェクトのインスタンスを参照します。オブジェクト参照 (OREF) をローカル変数に割り当てることができます。
SET myperson = ##class(Sample.Person).%New()
WRITE myperson
オブジェクトのインスタンスのメソッドやプロパティを参照するには、ドット構文を使用します。
SET myperson.Name = "El Vez"
変数にオブジェクトが使用されているかどうかを判断するには、$ISOBJECT 関数を使用します。
SET str = "A string"
SET myperson = ##class(Sample.Person).%New()
IF $ISOBJECT(myperson) {
WRITE "myperson is an object.",!
} ELSE {
WRITE "myperson is not an object."
}
IF $ISOBJECT(str) {
WRITE "str is an object."
} ELSE {
WRITE "str is not an object."
}
グローバルにはオブジェクト値を代入できません。代入すると、実行時エラーが発生します。
オブジェクト値を変数 (またはオブジェクトのプロパティ) に割り当てると、以下の例にあるように、オブジェクトの内部参照カウントが増分される悪影響があります。
SET x = ##class(Sample.Person).%New()
WRITE x,!
SET y = ##class(Sample.Person).%New()
WRITE y,!
SET z = ##class(Sample.Person).%New()
WRITE z,!
オブジェクトの参照番号が 0 に到達した場合、システムは自動的にそのオブジェクトを破壊します (%OnClose() コールバック・メソッドを呼び出し、そのオブジェクトをメモリから削除します)。
永続多次元配列 (グローバル)
グローバルは、多次元データベースのスパース配列です。グローバルは、グローバル変数名がキャレット記号 (^) で開始する以外は、他の配列タイプと同一です。データは、任意の数の添え字を付けてグローバルに格納できます。InterSystems IRIS の添え字にはタイプはありません。
以下は、グローバル使用の例です。グローバル ^x を設定すると、その値を検証できます。
SET ^x = 10
WRITE "The value of ^x is: ", ^x,!
SET ^x(2,3,5) = 17
WRITE "The value of ^x(2,3,5) is: ", ^x(2,3,5)
未定義の値
ObjectScript 変数を明示的に宣言または定義する必要はありません。変数に値を代入するとすぐ、この変数が定義されます。この最初の代入が行われるまで、この変数へのすべての参照は未定義となります。$DATA 関数を使用して、変数が定義済みであるか未定義であるかを判断できます。
$DATA は、1 つあるいは 2 つの引数を取ります。1 つの引数を取る場合、変数が値を持つかどうかをテストします。
WRITE "Does ""MyVar"" exist?",!
IF $DATA(MyVar) {
WRITE "It sure does!"
} ELSE {
WRITE "It sure doesn't!"
}
SET MyVar = 10
WRITE !,!,"How about now?",!
IF $DATA(MyVar) {
WRITE "It sure does!"
} ELSE {
WRITE "It sure doesn't!"
}
$DATA は、変数が値を持つ場合は True (1) を、値を持たない場合 (データがない場合) は False (0) のブーリアン値を返します。2 つの引数を取る場合、テストを実行し、2 番目の引数の変数を、テストされた変数の値と同じ値に設定します。
IF $DATA(Var1,Var2) {
WRITE "Var1 has a value of ",Var2,".",!
} ELSE {
WRITE "Var1 is undefined.",!
}
SET Var1 = 3
IF $DATA(Var1,Var2) {
WRITE "Var1 has a value of ",Var2,".",!
} ELSE {
WRITE "Var1 is undefined.",!
}
ブーリアン値
論理コマンドあるいは演算子と共に使用するなどの特定の場合、値はブーリアン値 (真偽値) に解釈されます。このような場合、式がゼロ以外の数値に評価される場合は 1 (True)、ゼロの数値に評価される場合は 0 (False) と解釈されます。数値文字列はそれ自身の数値として評価されますが、非数値文字列は 0 (False) に評価されます。
例えば、以下の値は True になります。
IF 1 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF 8.5 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF "1 banana" { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF 1+1 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF -7 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF +"007"=7 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
以下の値は False になります。
IF 0 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF 3-3 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF "one banana" { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF "" { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF -0 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
IF "007"=7 { WRITE "evaluates as true",! }
ELSE { WRITE "evaluates as false",! }
数値としての文字列の評価の詳細は、"文字列から数値への変換" を参照してください。
日付
ObjectScript には、組み込みの日付タイプはありません。その代わりに、文字列として表される日付値を操作または形式設定するための関数が多数あります。日付形式は以下のようになります。
形式 | 説明 |
---|---|
$HOROLOG | これは、$HOROLOG ($H) 特殊変数で返される形式です。これはコンマで区切られた 2 つの整数からなる文字列です。最初の整数は、1840 年 12 月 31 日以降の日数、2 番目は今日の日付の午前 0 時以降の秒数です。$HOROLOG では秒の小数部はサポートされません。$NOW 関数は、秒の小数部を使用した $HOROLOG 形式の日付を提供します。InterSystems IRIS は、日付を $HOROLOG 形式に設定したり、この形式の日付を検証したりするための多数の関数を用意しています。 |
ODBC Date | これは、ODBC と他の多くの外部表現で使用される形式です。文字列の形式は、“YYYY-MM-DD HH:MM:SS” となります。ODBC の日付値は順番に並べられます。つまり、ODBC 日付形式でデータをソートした場合、このデータは自動的に年代順に並べられます。 |
ロケールの日付 |
これは現在のロケールで使用される形式です。ロケールによって、日付の形式は以下のように異なります。 “アメリカ” の日付は mm/dd/yyyy (dateformat 1) の形式に設定されます。“ヨーロッパ” の日付は dd/mm/yyyy (dateformat 4) の形式に設定されます。csyw、deuw、engw、espw、eurw、fraw、itaw、mitw、ptbw、rusw、skyw、svnw、turw、ukrw を除くすべてのロケールでは、dateformat 1 を使用します。これらのロケールでは dateformat 4 を使用します。 アメリカの日付では、秒の小数部を表すためにピリオド (.) を小数点区切り文字として使用します。ヨーロッパの日付では、秒の小数部を表すためにコンマ (,) を小数点区切り文字として使用します。ただし、engw、eurw、skyw ではピリオドを使用します。 すべてのロケールでは、スラッシュ (/) を日付区切り文字として使用しますが、例外としてチェコ語 (csyw)、ロシア語 (rusw)、スロバキア語 (skyw)、スロベニア語 (svnw)、およびウクライナ語 (ukrw) ではピリオド (.) を使用します。 |
System Time | これは、$ZHOROLOG ($ZH) 特殊変数で返される形式です。システムが実行されている秒数 (とその一部) を含む浮動小数点数です。InterSystems IRIS を停止して再起動すると、この数値がリセットされます。一般的にこの形式は、処理のタイミングを計り検証するために使用します。 |
以下は、異なる日付形式の使用方法についての例です。
SET now = $HOROLOG
WRITE "Current time and date ($H): ",now,!
SET odbc = $ZDATETIME(now,3)
WRITE "Current time and date (ODBC): ",odbc,!
SET ldate = $ZDATETIME(now,-1)
WRITE "Current time and date in current locale format: ",ldate,!
SET time = $ZHOROLOG
WRITE "Current system time ($ZH): ",time,!