ObjectScript の演算子の概要
ObjectScript は、多様な演算子をサポートします。数理演算動作、論理比較などさまざまな動作を実行します。演算子は、最終的に 1 つの値に評価される変数や他のエンティティである式に対して作用します。ここでは、式と演算子について説明します。
概要
演算子とはシンボル文字で、対応するオペランドで実行する処理を指定するものです。各オペランドは、1 つ以上の式または式アトムから構成されます。演算子とその演算子に対応するオペランドを一緒に使用する場合、以下の形式になります。
[operand] 演算子 operand
演算子の中には、1 つのオペランドのみを使用する単項演算子があります。2 つのオペランドを使用するものは、二項演算子といいます。
式は、演算子とそこで使用されるオペランドで構成されます。
代入
ObjectScript の SET コマンドは、代入演算子 ( = ) を併用して変数に値を代入します。代入コマンドの右側に式が置かれます。
SET value = 0
SET value = a + b
ObjectScript では、代入コマンドの左側にも特定の関数を使用できます。
SET pies = "apple,banana,cherry"
WRITE "Before: ",pies,!
// set the 3rd comma-delimited piece of pies to coconut
SET $Piece(pies,",",3) = "coconut"
WRITE "After: ",pies
演算子の優先順位
ObjectScript で演算子の評価順序は、必ず左から右です。したがって、式の演算は表示された順番で実行されます。これは、特定の演算子の優先順位が他の演算子よりも高くなることがある他の言語と異なります。式で明示的に小括弧を使用して、特定の演算子を先に処理させることができます。以下に例を示します。
USER>WRITE "1 + 2 * 3 = ", 1 + 2 * 3
1 + 2 * 3 = 9
USER>WRITE 1 + 2 * 3
9
USER>WRITE 2 * 3 + 1
7
USER>WRITE 1 + (2 * 3)
7
USER>WRITE 2 * (3 + 1)
8
InterSystems SQL では、演算子の優先順位を構成でき、ObjectScript の演算子の優先順位と一致させる (または一致しないようにする) ことができます。
単項マイナス演算子
ObjectScript は、二項算術演算子より単項マイナス演算子を優先します。ObjectScript はまず数値式を検査し、単項マイナス演算子を実行します。その後、式を評価して結果を算出します。以下に例を示します。
USER>WRITE -123 - 3
-126
USER>WRITE -123 + - 3
-126
USER>WRITE -(123 - 3)
-120
括弧と優先順位
式の評価の順序は、それぞれの式を対の小括弧で入れ子にして変更できます。小括弧は、囲んだ式 (算術式と関係式の両方) をグループ化し、演算の順序を制御します。以下に例を示します。
USER>SET TorF = ((4 + 7) > (6 + 6))
USER>WRITE TorF
0
上記では、小括弧で 4 と 7、および 6 と 6 を加算しているため、論理式は 11 > 12 となり、結果は False になります。以下のコードと比較します。
USER>SET Value = (4 + 7 > 6 + 6)
USER>WRITE Value
7
この場合、演算の優先順位は左から右になります。したがって、最初に 4 と 7 を加算します。その合計の 11 と 6 を比較し、11 は 6 より大きくなるため、論理演算の結果は 1 (True) になります。その後、1 に 6 を加算するため、結果は 7 になります。
優先順位により結果のタイプが異なることに注意してください。上記の例で、最初の式の演算は最終的にブーリアン値を返し、2 番目の式は数値を返します。
以下の例では、複数レベルの入れ子を示します。
USER>WRITE 1+2*3-4*5
25
USER>WRITE 1+(2*3)-4*5
15
USER>WRITE 1+(2*(3-4))*5
-5
USER>WRITE 1+(((2*3)-4)*5)
11
内側の入れ子の式から 1 レベルずつ外側に進み、各レベルで左から右へと式が評価されます。
極めて単純な ObjectScript 式を除いて、すべての式全体を括弧で囲むことをお勧めします。これにより、評価の順序のあいまいさが解消され、コードの本来の意図について今後疑問が出ることもなくなります。
例えば、すべての演算子と同様に && 演算子は、左から右の順に実行されるため、以下のコード例の最後の文は 0 に評価されます。
USER>SET x = 3
USER>SET y = 2
USER>WRITE x && y = 2
0
これは、最後のステップで、評価が次のように実行されるからです。
-
最初に、x が定義されていて、0 以外の値であるかどうかが確認されます。x は 3 なので評価は続行されます。
-
次に、y が定義されていて、0 以外の値であるかどうかが確認されます。y は 2 なので評価は続行されます。
-
次に、3 && 2 の値が評価されます。3 も 2 も 0 ではないので、この式は True で、1 に評価されます。
-
次に、返された値を 2 と比較します。1 は 2 ではないので、この評価は 0 を返します。
多くのプログラミング言語に精通している人にとって、これは予想外の結果です。x に0 でない値が定義されていて、y が 2 のときに True を返すことを意図している場合は、次のように括弧が必要です。
USER>SET x = 3
USER>SET y = 2
USER>WRITE x && (y = 2)
1
関数と優先順位
関数など、式のタイプによって副次的作用が発生する場合があります。以下の論理式を考えてみます。
IF var1 = ($$ONE + (var2 * 5)) {
DO ^Test
}
ObjectScript は、最初に var1、次に関数 $$ONE、その次に var2 を評価します。その後、var2 を 5 倍し、最後に ObjectScript は、加算の結果が var1 の値に等しいかどうかをテストします。等しい場合、DO コマンドを実行して Test ルーチンを呼び出します。
別の例として、以下の例を考えてみます。
USER>SET var8=25,var7=23
USER>WRITE var8 = 25 * (var7 < 24)
1
ObjectScript は、厳密に左から右の順に式を評価します。プログラマは、括弧を使用して優先順位を確立する必要があります。この場合、ObjectScript はまず論理式 var8 = 25 を評価し、結果が 1 になります。次に、この結果に (var7 < 24) の結果を乗算します。式 (var7 < 24) は 1 に評価されます。このため、ObjectScript は 1 に 1 を乗算し、結果が 1 になります。
数値演算子
両方のオペランドが数値である場合、等価演算子 (=) を使用して、数値的に等しいかどうかを判断できます。他の ObjectScript の演算子はオペランドを数値として解釈し、オペランドが数値として解釈できる場合にのみ使用できます。これらの演算子は、以下のとおりです。
-
+
-
-
-
*
-
/
-
\
-
#
-
**
-
<
-
>
-
<=
-
>=
"ObjectScript の数値" を参照してください。
文字列演算子
等価演算子 (=) を使用すると、オペランドが数値として解釈できない場合、この演算子は文字列が等しいかどうかを判断します。
その他の ObjectScript の演算子は、常にオペランドを文字列として解釈します。これらの演算子は、以下のとおりです。
-
_ (連結演算子)
-
[ (包含関係演算子)
-
] (後続関係演算子)
-
]] (前後関係演算子)
-
? (パターン・マッチング演算子)
"ObjectScript の文字列" を参照してください。
ブーリアン演算子
ObjectScript には、オペランドを常に論理値として解釈する演算子が用意されています。これらは以下のとおりです。
-
' (論理 NOT)
-
& と && (論理 AND)
-
! と || (論理 OR)
一部の他の言語とは異なり、ObjectScript には、ブーリアン・リテラル値の特殊な表現は用意されていません。一部の他の言語とは異なり、ObjectScript には、ブーリアン・リテラル値の特殊な表現は用意されていません。代わりに、ゼロ以外の数値として解釈される式は true と見なされます。その他の式は false と見なされます。"文字列から数値への変換" を参照してください。
"ObjectScript のブーリアン値" を参照してください。
間接演算子 (@)
間接演算とは、コマンド行、コマンド、コマンド引数の一部あるいはすべてを、データ・フィールドの内容で、実行時にダイナミックに置換する手段です。
間接演算は、添え字間接演算の場合を除いて、間接演算子 (@) で指定され、以下の形式になります。
@variable
variable は、置換する値を取得する変数を識別します。置換する値で参照されるすべての変数は、プロシージャで使用されているとしてもパブリック変数です。変数は配列ノードにできます。
以下のルーチンは、間接演算がその右側にある変数全体の値を参照することを示します。
IndirectionExample
SET x = "ProcA"
SET x(3) = "ProcB"
; The next line will do ProcB, NOT ProcA(3)
DO @x(3)
QUIT
ProcA(var)
WRITE !,"At ProcA"
QUIT
ProcB(var)
WRITE !,"At ProcB"
QUIT
詳細は、"間接 (@)" のリファレンス・ページを参照してください。
間接演算は、他の方法より能率的かつ汎用的にコーディングできますが、必ずしも使用する必要はありません。XECUTE コマンドなど他の方法を使用して、間接演算と同様の機能を常に実行できます。