データ型とデータ値
ObjectScript は、タイプのない言語です (変数タイプを宣言する必要はありません)。変数は、文字列、数値、オブジェクト値を持つことができます。それでも ObjectScript では、以下のような異種データをいつ使用するかを把握しておくことは重要な情報となります。
文字列
文字列とは、文字、数字、句読点などの文字の組み合わせを、1 組の引用符 (") で囲んだものです。
SET string = "This is a string"
WRITE string
文字列についての項目は以下のとおりです。
引用符のエスケープ
" (二重引用符) 文字の前にもう 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) の表示方法も異なります。
Caché エンコード文字列 (ビット文字列、リスト構造文字列、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)) は小文字としてのみ定義されます。これを大文字に変換しても、結果は同じ小文字となります。これにより、英数字文字列を大文字または小文字のみの文字列に変換する場合は、常に小文字に変換することをお勧めします。
長い文字列
Caché では、以下の 2 つの最大文字列長オプションをサポートしています。
-
最大文字列長 32,767 文字の従来式
-
最大文字列長 3,641,144 文字の長い文字列
既定では長い文字列が有効になっています。長い文字列を有効にすると、文字列の最大長は 3,641,144 文字になります。長い文字列を無効にすると、文字列の最大長は 32,767 文字になります。
現在の文字列の最大長を超えると、<MAXSTRING> エラーが発生します。
以下のように、MaxLocalLength()Opens in a new tab メソッドを呼び出して、システム全体の文字列の最大長を返すことができます。
WRITE $SYSTEM.SYS.MaxLocalLength()
以下の操作のいずれかを使用して、システム全体で長い文字列を有効または無効にすることができます。
-
管理ポータルで、システム, 構成, メモリと開始設定 を選択します。[システムメモリと開始設定] ページで、[Long String有効] チェック・ボックスにチェックを付けます。
-
"Caché パラメータ・ファイル・リファレンス" の "EnableLongStrings" セクションの説明に従って、Caché パラメータ・ファイル (CPF ファイル) で EnableLongStrings パラメータの値を指定します。
-
Config.MiscellaneousOpens in a new tab クラス・プロパティで、EnableLongStringsOpens in a new tab ブーリアン値を指定します。これにより、対応する CPF ファイル・パラメータが変更されます。例えば、以下のようになります。
ZNSPACE "%SYS" SET getstat=##class(Config.Miscellaneous).Get(.Properties) IF getstat '= 1 {WRITE "Get config property error",! QUIT} SET Properties("EnableLongStrings")=0 SET modstat=##class(Config.Miscellaneous).Modify(.Properties) IF modstat '= 1 {WRITE "Modify config property error",! QUIT}
プロセスで実際に長い文字列が使用されると、文字列用のメモリを、そのプロセス用のパーティション・メモリ領域から割り当てるのではなく、オペレーティング・システムの malloc() バッファから割り当てます。したがって、実際の長い文字列の値へのメモリ割り当ては、プロセス・パラメータ (プロセスあたりの最大メモリ (KB)) あたりの最大メモリの設定に制限されず、プロセスの $STORAGE 値に影響しません。
ビット文字列
ビット文字列は、番号付きビットとブーリアン値の論理セットを表します。文字列内のビットには、ビット番号 1 から始まる番号が付けられます。ブーリアン値 1 に明示的に設定されていない番号付きビットは、0 と評価されます。したがって、明示的に設定された番号付きビット以外のものを参照すると、ビット値 0 が返されます。
ビット文字列には論理長があります。これは、0 または 1 のいずれかに明示的に設定された最上位のビット位置です。この論理長には、$BITCOUNT 関数を使用することでのみアクセスできます。ただし、通常は、アプリケーション・ロジックでは論理長を使用しないでください。ビット文字列関数の場合、未定義のグローバル変数またはローカル変数は、ビット値 0 を返す指定された番号付きビットを持ち、$BITCOUNT 値 が 0 であるビット文字列と同等です。
ビット文字列は、内部形式を持つ通常の Caché 文字列として保存されます。この内部文字列の表現には、ビット文字列関数ではアクセスできません。この内部形式のため、ビット文字列の文字列長は、文字列内のビット数に関する情報を判断する際に意味がありません。
ビット文字列の内部形式という理由により、連結演算子をビット文字列と共に使用することはできません。これを実行しようとすると、<INVALID BIT STRING> エラーが返されます。
同じ状態 (同じブーリアン値を持つ) の 2 つのビット文字列が、異なる内部文字列表現を持つ場合があります。したがって、文字列表現は、アプリケーション・ロジックで調査したり、比較したりしないでください。ビット文字列関数の場合、NULL 文字列および未定義のグローバル変数またはローカル変数は、すべてのビットが 0 で長さが 0 のビット文字列と同等です。
トランザクション中にグローバル変数で設定されたビットは前の値に戻され、その後にトランザクションのロールバックが行われます。ただし、グローバル変数のビット文字列は、ロールバック操作によって前の文字列長または前の内部文字列表現に戻りません。ローカル変数は、ロールバック操作によって元に戻りません。
論理ビットマップ構造は、ビット文字列の配列で表現できます。この配列の各要素が固定のビット数を持つ 1 つの「チャンク」を表しています。未定義はすべてのビットが 0 のチャンクと同等であるため、配列はスパースになることがあります。すべてのビットが 0 のチャンクを表す配列要素は、存在している必要は一切ありません。この理由および上記のロールバック動作のため、アプリケーション・ロジックでは、ビット文字列の長さや $BITCOUNT(str) または $BITCOUNT(str,0) を使用してアクセスできる 0 値のビットのカウントに依存しないようにする必要があります。
数値
数値に関連するトピックは、以下のとおりです。
数値の基本
数値リテラルに句読点は必要ありません。任意の有効な数値文字を使用して数を指定できます。Caché では、数値が構文的に有効と評価されると、その数値がキャノニック形式に変換されます。
数値リテラルの構文要件は以下のようになります。
-
0 ~ 9 の 10 進数を含むことができ、少なくともそれらの数値文字のいずれかを含んでいること。先頭または末尾にゼロを使用できます。
-
任意のシーケンスで、先頭に任意の数のプラス符号とマイナス符号を使用できます。ただし、プラス符号とマイナス符号は、科学的記数法の文字 “E” を除き、他の任意の文字の後に位置することはできません。数値式では、非符号文字の後の符号は加算または減算として評価されます。数値文字列では、非符号文字の後の符号は非数値文字として評価され、そこで文字列の数値部が終わります。
Caché では、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 組みの括弧を使用できます。これらの括弧は数の一部ではありませんが、処理の優先順位を決定します。既定では、Caché は、厳密に左から右の順序ですべての処理を実行します。
数値のキャノニック形式
ObjectScript では、数に対する数値演算のすべてをキャノニック形式で実行します。例えば、数値 +007.00 の長さは 1 になり、文字列 "+007.00" の長さは 7 になります。
Caché で数をキャノニック形式に変換するときには、以下の手順が実行されます。
-
科学的記数法の指数が解決されます。例えば、3E4 は 30000 に変換され、3E-4 は .0003 に変換されます。
-
先頭の符号が解決されます。まず、複数の符号が 1 つの符号に解決されます (例えば、2 つのマイナス符号が 1 つのプラス符号になります)。次に、先頭にあるプラス符号が削除されます。$FNUMBER 関数を使用すると、Caché のキャノニック形式の正の数にプラス記号を追加できます。
Note:ObjectScript は、先頭のプラス記号とマイナス記号の任意の組み合わせを解決します。SQL では、2 つの連続したマイナス記号は、1 行コメント文字として解析されます。したがって、先頭に 2 つの連続したマイナス記号を付けて SQL で数値を指定すると、SQLCODE -12 エラーになります。
-
先頭と末尾のゼロがすべて削除されます。これには、整数ゼロを小数から除去することも含まれます。例えば、0.66 は .66 となります。
-
キャノニック形式の小数に整数ゼロを追加するには、$FNUMBER 関数または $JUSTIFY 関数を使用します。例えば、.66 は 0.66 になります。
-
非キャノニック形式の小数から整数ゼロを削除するには、単項プラス演算子を使用します。例えば、+$PIECE($ZTMESTAMP,",",2).0.66 は .66 になります。
この変換の一環として、ゼロの小数は 0 に単純化されます。表現方法 (0.0、.0、.000) にかかわらず、すべてのゼロ値は 0 に変換されます。
-
-
末尾の小数点区切りが削除されます。
-
-0 は 0 に変換されます。
-
算術演算と数値の連結が実行されます。Caché は、こうした演算を厳密に左から右の順に実行します。このような演算は、キャノニック形式の数で実行されます。詳細は、後述の "数字の連結" を参照してください。
Caché のキャノニック形式の数は、その他のインターシステムズのソフトウェアで使用されているキャノニック形式の数とは異なります。
-
ODBC: 整数ゼロの小数は、1 つのゼロ整数を含む ODBC に変換されます。そのため、.66 と 000.66 は、どちらも 0.66 になります。$FNUMBER 関数または $JUSTIFY 関数を使用すると、Caché のキャノニック形式の数に整数ゼロを追加できます。
-
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” です。Caché の数値演算とブーリアン演算 (等値演算は除く) では共に、数値ではない文字を検出するまで混合数値文字列を数値として解析します。数値でない文字を検出した時点で残りの文字列を無視します。以下に混合数値文字列の算術演算の例を示します。
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
-
非数値文字列とは、数値文字の前に数値ではない文字がある任意の文字列です。空白は数値ではない文字と見なされます。Caché の数値演算とブーリアン演算 (等値演算は除く) では共に、このような文字列を数値 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)
"Caché ObjectScript リファレンス" に示したとおり、個別のコマンドと関数に対する数値文字列の例外処理は共通となります。
数字の連結
連結演算子 (_) を使用して、ある数と別の数を連結できます。Caché は、まずそれぞれの数値をキャノニック形式に変換してから、その結果に対して文字列連結を実行します。したがって、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” になります。
Caché は、キャノニック形式に変換した後の数に対して、数値の連結と算術演算を実行します。こうした演算は厳密に左から右の順に実行されます。ただし、演算の優先順位を決める括弧が指定されている場合を除きます。以下の例では、この結果について説明しています。
WRITE 7_-6+5 // returns 12
この例では、連結によって文字列 "7-6" が返されます。これが、キャノニック形式の数でないことは明白です。Caché は、最初の非数値文字 (埋め込みのマイナス記号) を切り捨てることで、この文字列をキャノニック形式の数に変換します。その後で、このキャノニック形式の数を使用して次の演算 7 + 5 = 12 を実行します。
小数
Caché は、小数を表すために使用できる 2 つの異なる数値タイプをサポートしています。
-
10 進数の浮動小数点 : 既定では、Caché は、固有の 10 進数の浮動小数点標準 ($DECIMAL 数) を使用して小数を表します。これは、ほとんどの場合の優先形式であり、最高レベルの精度 (小数点以下 18 桁) が得られます。これは、Caché がサポートしているすべてのシステム・プラットフォームで一貫しています。10 進数の浮動小数点は、データ・ベースの値で優先的に使用されます。特に、0.1 などの小数は、10 進数の浮動小数記数法を使用して正確に表現できますが、小数 0.1 (およびほとんどの 10 進数の小数) はバイナリ浮動小数点では近似値で表現できるだけです。
-
バイナリ浮動小数点 : IEEE 倍精度バイナリ浮動小数点標準は、小数を表現する業界標準の方法です。IEEE 浮動小数点数は、バイナリ表現でエンコードされます。バイナリ浮動小数点表現は、ほとんどのコンピュータがバイナリ浮動小数点演算のための高速ハードウェアを搭載しているため、通常、高速計算を実行する場合に優先的に使用されます。倍精度バイナリ小数点の精度は 53 バイナリ・ビットで、小数点以下 15.95 桁の精度に相当しますバイナリ表現は、0.1 などの小数をバイナリ小数の有限シーケンスとして表現できないため、10 進数の小数と正確には一致しません。ほとんどの小数はこのバイナリ表現では正確に表すことができないため、IEEE 浮動小数点数は対応する Caché 標準の浮動小数点数とは若干異なる場合があります。IEEE 浮動小数点数が小数として表示されるとき、バイナリ・ビットが18 桁を大幅に超える小数桁数の小数に変換されることがよくあります。これは、IEEE 浮動小数点数が Caché 標準の小数より精度が高いことを意味するわけではありません。IEEE 浮動小数点数では、Caché 標準の数値よりも大きい数および小さい数を表現でき、さらに特別な値 INF (無限大) および NAN (非数値) がサポートされています。詳細は、"$DOUBLE 関数" を参照してください。
$DOUBLE 関数を使用して、Caché 標準の浮動小数点数を IEEE 浮動小数点数に変換できます。また、$DECIMAL 関数を使用して、IEEE 浮動小数点数を Caché 標準の浮動小数点数に変換できます。
既定では、Caché は小数をキャノニック形式に変換して、先頭のゼロをすべて削除します。したがって、0.66 は .66 となります。$FNUMBER (ほとんどの形式) および $JUSTIFY (3 パラメータ形式) は常に、最低 1 桁の整数を伴う小数を返します。これらの関数のいずれかを使用した場合、.66 は 0.66 となります。
$FNUMBER および $JUSTIFY を使用すれば、指定した小数桁数に対して丸めや埋め込みを行うことができます。Caché では、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"}
Caché でサポートされる最大の 10 進数の浮動小数点数は 9.223372036854775807E145 です。サポートされる最大の $DOUBLE 値 (INFINITY への IEEE オーバーフローが無効であると想定) は 1.7976931348623157081E308 です。$DOUBLE 型は、Caché の 10 進数型よりも広い範囲をサポートしますが、Caché の 10 進数型の方が高精度をサポートします。Caché の 10 進数型の精度は約 18.96 桁 (普通は 19 桁だが、時折 18 桁の精度) ですが、$DOUBLE 型の通常の精度は約 15.95 桁 (53 バイナリ桁) です。既定では、Caché は数値リテラルを 10 進数の浮動小数点数として表現します。ただし、数値リテラルが Caché の 10 進数で表現できる数値より大きい場合 (9.223372036854775807E145 より大きい場合)、Caché はその数値を $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 です。
Caché の小数または IEEE 倍精度数を使用する際の大きな数字に関する考慮事項の詳細は、"Caché プログラミング入門ガイド" の付録 “インターシステムズ・アプリケーションでの数値の計算” を参照してください。
オブジェクト
オブジェクト値は、メモリ内のオブジェクトのインスタンスを参照します。オブジェクト参照 (OREF) をローカル変数に割り当てることができます。
ZNSPACE "SAMPLES"
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."
}
グローバルにはオブジェクト値を代入できません。代入すると、実行時エラーが発生します。
オブジェクト値を変数 (またはオブジェクトのプロパティ) に割り当てると、以下の例にあるように、オブジェクトの内部参照カウントが増分される悪影響があります。
ZNSPACE "SAMPLES"
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() メソッドを呼び出し、そのオブジェクトをメモリから削除します)。
永続多次元配列 (グローバル)
グローバルは、多次元データベースのスパース配列です。グローバルは、グローバル変数名がキャレット記号 (^) で開始する以外は、他の配列タイプと同一です。データは、添え字をつけてグローバルに格納されます。 Caché の添え字にはタイプはありません。
以下は、グローバル使用の例です。グローバル ^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)
グローバルの詳細は、このドキュメントの “多次元配列” の章と "Caché グローバルの使用法" のドキュメントを参照してください。
未定義の値
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 形式の日付を提供します。Caché は、日付を $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) 特殊変数で返される形式です。システムが実行されている秒数 (とその一部) を含む浮動小数点数です。Caché を停止して再起動すると、この数値がリセットされます。一般的にこの形式は、処理のタイミングを計り検証するために使用します。 |
以下は、異なる日付形式の使用方法についての例です。
日付形式
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,!