Skip to main content

演算子と式

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 で演算子の評価順序は、必ず左から右です。したがって、式の演算は表示された順番で実行されます。これは、特定の演算子の優先順位が他の演算子よりも高くなることがある他の言語と異なります。式で明示的に小括弧を使用して、特定の演算子を先に処理させることができます。

 WRITE "1 + 2 * 3 = ", 1 + 2 * 3,!  // returns 9
 WRITE "2 * 3 + 1 = ", 2 * 3 + 1,!  // returns 7
 WRITE "1 + (2 * 3) = ", 1 + (2 * 3),!  // returns 7
 WRITE "2 * (3 + 1) = ", 2 * (3 + 1),!  // returns 8

InterSystems SQL では、演算子の優先順位を構成でき、ObjectScript の演算子の優先順位と一致させる (または一致しないようにする) ことができます。

単項マイナス演算子

ObjectScript は、二項算術演算子より単項マイナス演算子を優先します。ObjectScript はまず数値式を検査し、単項マイナス演算子を実行します。その後、式を評価して結果を算出します。

  WRITE -123 - 3,!       // returns -126
  WRITE -123 + -3,!      // returns -126
  WRITE -(123 - 3),!     // returns -120

括弧と優先順位

式の評価の順序は、それぞれの式を対の小括弧で入れ子にして変更できます。小括弧は、囲んだ式 (算術式と関係式の両方) をグループ化し、ObjectScript が式で実行する演算の順序を制御します。以下の例を考えてみます。

  SET TorF = ((4 + 7) > (6 + 6)) // False (0)
  WRITE TorF

上記では、小括弧で 4 と 7、および 6 と 6 を加算しているため、論理式は 11 > 12 となり、結果は False になります。以下のコードと比較します。

  SET Value = (4 + 7 > 6 + 6) // 7
  WRITE Value

この場合、演算の優先順位は左から右になります。したがって、最初に 4 と 7 を加算します。その合計の 11 と 6 を比較し、11 は 6 より大きくなるため、論理演算の結果は 1 (True) になります。その後、1 に 6 を加算するため、結果は 7 になります。

優先順位により結果のタイプが異なることに注意してください。上記の例で、最初の式の演算は最終的にブーリアン値を返し、2 番目の式は数値を返します。

以下の例では、複数レベルの入れ子を示します。

 WRITE 1+2*3-4*5,!  // returns 25
 WRITE 1+(2*3)-4*5,!  // returns 15
 WRITE 1+(2*(3-4))*5,!  // returns -5
 WRITE 1+(((2*3)-4)*5),!  // returns 11

内側の入れ子の式から 1 レベルずつ外側に進み、各レベルで左から右へと式が評価されます。

Tip:

極めて単純な ObjectScript 式を除いて、すべての式全体を括弧で囲むことをお勧めします。これにより、評価の順序のあいまいさが解消され、コードの本来の意図について今後疑問が出ることもなくなります。

例えば、すべての演算子と同様に && 演算子は、左から右の順に実行されるため、以下のコード例の最後の文は 0 に評価されます。

 SET x = 3
 SET y = 2
 IF x && y = 2 {
   WRITE "True",! } 
 ELSE {
   WRITE "False",! }

これは評価が次のように実行されるからです。

  1. 最初に、x が定義されていて、0 以外の値であるかどうかが確認されます。x は 3 なので評価は続行されます。

  2. 次に、y が定義されていて、0 以外の値であるかどうかが確認されます。y は 2 なので評価は続行されます。

  3. 次に、3 && 2 の値が評価されます。3 も 2 も 0 ではないので、この式は True で、1 に評価されます。

  4. 次に、返された値を 2 と比較します。1 は 2 ではないので、この評価は 0 を返します。

多くのプログラミング言語に精通している人にとって、これは予想外の結果です。x に0 でない値が定義されていて、y が 2 のときに True を返すことを意図している場合は、次のように括弧が必要です。

 SET x = 3
 SET y = 2
 IF x && (y = 2) {
   WRITE "True",! } 
 ELSE {
   WRITE "False",! }

関数と優先順位

関数など、式のタイプによって副次的作用が発生する場合があります。以下の論理式を考えてみます。

 IF var1 = ($$ONE + (var2 * 5)) {
    DO ^Test 
 }

ObjectScript は、最初に var1、次に関数 $$ONE、その次に var2 を評価します。その後、var2 を 5 倍し、最後に ObjectScript は、加算の結果が var1 の値に等しいかどうかをテストします。等しい場合、DO コマンドを実行して Test ルーチンを呼び出します。

別の例として、以下の論理式を考えてみます。

  SET var8=25,var7=23
  IF var8 = 25 * (var7 < 24) {
    WRITE !,"True" }
  ELSE {
    WRITE !,"False" }

ObjectScript は、厳密に左から右の順に式を評価します。プログラマは、括弧を使用して優先順位を確立する必要があります。この場合、ObjectScript はまず var8=25 を評価し、結果が 1 になります。次に、この 1 に括弧内の式の結果を乗算します。var7 は、24 より小さいので、括弧内の式は、1 と評価されます。したがって、ObjectScript は、1 * 1 の乗算を行い、結果は 1 (True) となります。

文字列から数値への変換

文字列は数値、部分的数値、または非数値となり得ます。

  • 数値文字列はすべて数字で構成されます。例えば、"123""+123"".123""++0007""-0" となります。

  • 部分的数値の文字列とは、数字で始まり、非数値の文字が続く文字列です。例えば、"3 blind mice""-12 degrees" となります。

  • 非数値の文字列は数値ではない文字で始まります。例えば、" 123""the 3 blind mice""three blind mice" となります。

数値文字列

数値文字列または部分的文字列を算術式で使用する場合、文字列は数値として解釈されます。文字列で左から右に数値文字をスキャンしてこの数値を取得し、数値リテラルと解釈できる開始文字の最長シーケンスを見つけます。以下の文字が可能です。

  • 0 から 9 までの数字。

  • PlusSign プロパティ値および MinusSign プロパティ値。既定では、それらは + および - の文字となりますが、ロケールに依存します。%SYS.NLS.Format.GetFormatItem()Opens in a new tab メソッドを使用して、現在の設定を返します。

  • DecimalSeparator プロパティ値。既定では、これは . の文字となりますが、ロケールに依存します。%SYS.NLS.Format.GetFormatItem()Opens in a new tab メソッドを使用して、現在の設定を返します。

  • 文字の e および E は、シーケンス内で 4E3 などの科学的記数法を表す場合に、数値文字列の一部を含むことができます。

NumericGroupSeparator プロパティ値 (既定では、, の文字) は、数値文字とは見なされないことに注意してください。したがって、文字列 "123,456" は部分的数値文字列となり、数 "123" に分解されます。

数値文字列および部分的数値文字列は、算術演算 (加算および減算) および「より大きい/より小さい」などの比較演算 (<、>、<=、>=) に優先して、キャノニック形式に変換されます。数値文字列は等値比較 (=、'=) に優先して、キャノニック形式へ変換されません。この理由は、それらの演算子が文字列比較にも使用されるためです。

以下の例は、数値文字列の算術比較を示しています。

  WRITE "3" + 4,!             // returns 7
  WRITE "003.0" + 4,!         // returns 7
  WRITE "++--3" + 4,!         // returns 7
  WRITE "3 blind mice" + 4,!  // returns 7

以下の例は、数値文字列の < (より小さい) 比較を示しています。

  WRITE "3" < 4,!             // returns 1
  WRITE "003.0" < 4,!         // returns 1
  WRITE "++--3" < 4,!         // returns 1
  WRITE "3 blind mice" < 4,!  // returns 1

以下の例は、数値文字列の <= 比較を示しています。

  WRITE "4" <= 4,!             // returns 1
  WRITE "004.0" <= 4,!         // returns 1
  WRITE "++--4" <= 4,!         // returns 1
  WRITE "4 horsemen" <= 4,!    // returns 1

以下の例は、数値文字列の等値比較を示しています。非キャノニック形式の数値文字列は、数値ではなく、文字列として比較されます。-0 は非キャノニック形式の数値文字列です。したがって、数値ではなく、文字列として比較されます。

  WRITE "4" = 4.00,!          // returns 1
  WRITE "004.0" = 4,!         // returns 0
  WRITE "++--4" = 4,!         // returns 0
  WRITE "4 horsemen" = 4,!    // returns 0
  WRITE "-4" = -4,!           // returns 1
  WRITE "0" = 0,!             // returns 1
  WRITE "-0" = 0,!            // returns 0
  WRITE "-0" = -0,!           // returns 0

非数値文字列

文字列の先頭の文字が数値文字ではない場合、すべての算術演算に対する文字列の数値は 0 となります。<、>、'>、<=、'<、および >= による比較演算でも、数値ではない文字列は 0 として扱われます。等号は数値的等値演算子および文字列比較演算子の両方として使用されるので、= および '= の演算では文字列比較が優先されます。PlusSign プロパティ値 (既定では +) を追加することで、文字列の数値的評価を強制することができます (例: "+123")。x および y が異なる非数値文字列 (x=”Fred”、y=”Wilma” など) である場合、結果は以下の論理値となります。

x, y x, x +x, y +x, +y +x, +x
x=y は False x=x は True +x=y は False +x=+y は True +x=+x は True
x'=y は True x=y は False +x'=y は True +x'=+y は False +x'=+x は False
x<y は FALSE x<x は FALSE +x<y は FALSE +x<+y は FALSE +x<+x は FALSE
x<=y は TRUE x<=x は TRUE +x<=y は TRUE +x<=+y は TRUE +x<=+x は TRUE

ObjectScript 式は、値を算出するために評価される 1 つ以上の トークン です。最も単純な式は、リテラルあるいは変数です。

 SET expr = 22
 SET expr = "hello"
 SET expr = x

配列、演算子、多くの ObjectScript 関数の 1 つを使用して、さらに複雑な式を記述できます。

 SET expr = +x
 SET expr = x + 22
 SET expr = array(1)
 SET expr = ^data("x",1)
 SET expr = $Length(x)

式は、オブジェクト・プロパティ、インスタンス・メソッド呼び出し、クラス・メソッド呼び出しから構成されます。

 SET expr = person.Name
 SET expr = obj.Add(1,2)
 SET expr = ##class(MyApp.MyClass).Method()

ルーチン呼び出しの前に $$ を置き、ObjectScript ルーチン呼び出しを式で直接実行できます。

 SET expr = $$MyFunc^MyRoutine(1)

式は、返す値の種類で分類できます。

  • 算術式は算術演算子を含み、オペランドを数値として解釈し、数値結果を算出します。

     SET expr = 1 + 2
     SET expr = +x
     SET expr = a + b
    

    算術式で使用される文字列は、数値として評価されます (有効な数値がない場合は 0 となります)。また、単項加算演算子 (+) を使用すると、文字列値を数値に暗黙に変換します。

  • 文字列式は文字列演算子を含み、オペランドを文字列として解釈し、文字列の結果を返します。

     SET expr = "hello"
     SET expr = "hello" _ x
    
  • 論理式は関係演算子と論理演算子を含み、オペランドを論理解釈し、True (1) あるいは False (0) のブーリアン値を返します。

     SET expr = 1 && 0
     SET expr = a && b
     SET expr = a > b
    
  • オブジェクト式 は、結果としてオブジェクト参照を生成します。

     SET expr = object
     SET expr = employee.Company
     SET expr = ##class(Person).%New()

論理式

論理式は、論理演算子数値関係演算子文字列関係演算子 を使用します。式を評価し、1 (True) または 0 (False) のブーリアン値を返します。論理式は、通常、以下を使用します。

ブーリアン・テストでは、ゼロ以外の数値に評価される式はいずれもブーリアン 1 (True) の値を返します。ゼロの数値に評価される式はいずれもブーリアン 0 (False) の値を返します。InterSystems IRIS® データ・プラットフォームでは、非数値文字列がゼロの数値を有しているものとして評価します。詳細は、"文字列から数値への変換" を参照してください。

論理演算子を使用することにより、複数のブーリアン論理式を組み合わせることができます。すべての InterSystems IRIS の式と同様に、これらは厳密に左から順に評価されます。論理演算子のタイプには、正規論理演算子 (& および !) と簡易論理演算子 (&& および ||) の 2 つがあります。

正規論理演算子を使用して論理式を組み合わせる場合、InterSystems IRIS では、すべての式の評価が完了する前にブーリアン値の結果が分かっていたとしても、指定された式をすべて評価します。これにより、すべての式の妥当性が保証されます。

簡易論理演算子を使用して論理式を組み合わせる場合、InterSystems IRIS ではブーリアン値結果の割り出しに必要な式のみを評価します。例えば、複数の AND テストをする場合、0 を返す最初の式によって全体のブーリアン値結果が決まります。この式の右側にある論理式は評価されません。これにより、不必要な時間的浪費となる式の評価を回避できます。

コンマ区切りリストを引数値として指定できるコマンドもあります。この場合、InterSystems IRIS ではリストの各引数を独立コマンド文のように扱います。したがって、IF x=7,y=4,z=2IF x=7 THEN IF y=4 THEN IF z=2 と解析され、簡易論理演算子の文の IF (x=7)&&(y=4)&&(z=2) と機能的に同一となります。

以下の例では、IF テストにて正規論理演算子 (&) を使用しています。したがって、最初の関数が 0 (False) を返すため、自動的に式全体の結果が False になりますが、すべての関数が実行されます。

LogExp
 IF $$One() & $$Two() {
    WRITE !,"Expression is TRUE."  } 
 ELSE {
    WRITE !,"Expression is FALSE." }
One() 
 WRITE !,"one"
 QUIT 0
Two()
 WRITE !,"two"
 QUIT 1

以下の例では、IF テストにて簡易論理演算子 (&&) を使用しています。したがって、最初の関数の実行により 0 (False) を返すため、自動的に式全体の結果が False になります。2 番目の関数は実行されません。

LogExp
 IF $$One() && $$Two() {
    WRITE !,"Expression is TRUE."  } 
 ELSE {
    WRITE !,"Expression is FALSE." }
One() 
 WRITE !,"one"
 QUIT 0
Two()
 WRITE !,"two"
 QUIT 1

以下の例では、IF テストにてコンマ区切り引数を指定しています。コンマは論理演算子ではありませんが、簡易 && 論理演算子の指定と同じ効果があります。最初の関数の実行により 0 (False) を返すため、自動的に式全体の結果が False になります。2 番目の関数は実行されません。

LogExp
 IF $$One(),$$Two() {
    WRITE !,"Expression is TRUE."  } 
 ELSE {
    WRITE !,"Expression is FALSE." }
One() 
 WRITE !,"one"
 QUIT 0
Two()
 WRITE !,"two"
 QUIT 1

算術演算子

算術演算子は、オペランドを数値として解釈し、数値結果を生成します。文字列について演算する場合、算術演算子は、"文字列から数値への変換" で説明したルールに従って、文字列をその数値として扱います。ObjectScript は、以下の算術演算子を提供します。

単項プラス (+)

単項プラス演算子 (+) は、単一のオペランドを数値として解釈します。数値として解釈できない文字に遭遇するまで、文字列の文字を数値として順番に解析することで、これを実行します。そして、適格な数値に変換した文字列の先頭部分を返します (そのような解釈が可能でない場合は 0 を返します)。以下に例を示します。

 WRITE + "32 dollars and 64 cents"        // 32

詳細は、"単項プラス (+)" のリファレンス・ページを参照してください。

単項マイナス (-)

単項マイナス演算子 (-) は、数値として解釈されるオペランドの符号を反転します。以下に例を示します。

 SET x = -60
 WRITE " x: ", x,! // -60
 WRITE "-x: ",-x,! // 60

ObjectScript は、二項 (2 オペランド) 算術演算子より単項マイナス演算子を優先します。

詳細は、"単項マイナス (-)" のリファレンス・ページを参照してください。

数値式の絶対値を返すには、$ZABS 関数を使用します。

加算 (+)

加算演算子は、2 つの数値を加算します。以下に例を示します。

 WRITE 2936.22 + 301.45 //  3237.67

詳細は、"加算 (+)" のリファレンス・ページを参照してください。

減算 (-)

減算演算子は、ある数値を別の数値から減算します。以下に例を示します。

 WRITE 2936.22 - 301.45 // 2634.77

詳細は、"減算 (-)" のリファレンス・ページを参照してください。

乗算 (*)

乗算演算子は、2 つの数値を乗算します。以下に例を示します。

 WRITE 9 * 5.5 // 49.5

詳細は、"乗算 (*)" のリファレンス・ページを参照してください。

除算 (/)

除算演算子は、ある数値を別の数値で除算します。以下に例を示します。

 WRITE 9 / 5.5 // 1.636363636363636364

詳細は、"除算 (/)" のリファレンス・ページを参照してください。

整数除算 (\)

整数除算演算子は、ある数値を別の数値で除算し、小数値を破棄します。以下に例を示します。

 WRITE "355 \ 113 = ", 355 \ 113 // 3

詳細は、"整数除算 (\)" のリファレンス・ページを参照してください。

モジュロ (#)

2 つのオペランドが正の場合、モジュロ演算の結果は、右のオペランドで左のオペランドを整数除算した剰余です。以下に例を示します。

 WRITE "37 # 10 = ",37 # 10,! // 7
 WRITE "12.5 # 3.2 = ",12.5 # 3.2,! // 2.9

詳細は、"モジュロ (#)" のリファレンス・ページを参照してください。

べき乗 (**)

べき乗演算子は、ある数値を、別の数値を指数としてべき乗します。以下に例を示します。

 WRITE "9 ** 2 = ",9 ** 2,! // 81

詳細は、"べき乗 (**)" のリファレンス・ページを参照してください。べき乗計算は、$ZPOWER 関数を使用しても可能です。

Note:

InterSystems IRIS では、ObjectScript の 10 進数浮動小数点数 (10 進形式と呼ばれる) と IEEE 倍精度バイナリ浮動小数点数 ($DOUBLE と呼ばれ、通常特殊な目的に使用される) の 2 つの数の表現がサポートされています。ObjectScript は、以下の状況では、10 進数値を対応する $DOUBLE 値に自動的に変換します。

  • 算術演算に $DOUBLE 値が含まれている場合、ObjectScript は演算内のすべての数値を $DOUBLE に変換します。

  • 演算の結果の数値が 10 進形式で表すには大きすぎる場合、ObjectScript は、<MAXNUMBER> エラーを発行するのではなく、この数値を $DOUBLE に自動的に変換します。

これらの形式の詳細は、"インターシステムズ・アプリケーションでの数値の計算" を参照してください。

数値関係演算子

数値関係演算子は、オペランドの数値を使用してブーリアン値の結果を返します。文字列に対する演算では、"文字列から数値への変換" に説明があるルールに従い、文字列は数値関係演算子によってそれぞれが該当する数値として扱われます。

数値関係演算子を非数値文字列の比較で使用しないでください

ObjectScript は、以下の数値関係演算子を提供します。

より小さい関係演算子 (<)

より小さい関係演算子は、左のオペランドが右のオペランドより小さいかどうかをテストします。以下に例を示します。

 WRITE 9 < 6    // 0 

詳細は、"より小さい (<)" のリファレンス・ページを参照してください。

より大きい関係演算子 (>)

より大きい関係演算子は、左のオペランドが右のオペランドより大きいかどうかをテストします。以下に例を示します。

 WRITE 15 > 15 // 0

詳細は、"より大きい (>)" のリファレンス・ページを参照してください。

以下演算子 (<= または '>)

以下演算子は、左のオペランドが右のオペランド以下であるかどうかをテストします。以下に例を示します。

 WRITE 9 <= 6    // 0 

"以下 (<= または '>)" のリファレンス・ページを参照してください。

以上演算子 (>= または '<)

以上演算子は、左のオペランドが右のオペランド以上であるかどうかをテストします。以下に例を示します。

 WRITE 15 >= 15 // 1

"以上 (>= または '<)" のリファレンス・ページを参照してください。

Note:

InterSystems IRIS では、ObjectScript の 10 進数浮動小数点数 (10 進形式と呼ばれる) と IEEE 倍精度バイナリ浮動小数点数 ($DOUBLE 形式と呼ばれ、通常特殊な目的に使用される) の 2 つの数の表現がサポートされています。

これらの形式の数値間では、以下/以上の比較は丸めを行わず正確に行われます。ただし、10 進数と $DOUBLE の数値の等値比較は、予期しない結果が発生することが多いので避ける必要があります。詳細は、"インターシステムズ・アプリケーションでの数値の計算" を参照してください。

論理比較演算子

論理比較演算子は、オペランド値を比較し、True (1) か False (0) のブーリアン値を返します。

論理演算子の優先順位

ObjectScript は、厳格に演算子を左から右へ評価するため、その他の演算子が関与する論理比較では、必要な優先順位を実現するために、演算をグループ化する括弧を使用する必要があります。例えば、以下のプログラムで True (1) を返すために、論理 OR (!) テストが要求されます。

  SET x=1,y=0
  IF x=1 ! y=0 {WRITE "TRUE"}
  ELSE {WRITE "FALSE" } 
  // Returns 0 (FALSE), due to evaluation order

しかし、この論理比較を適切に実行するには、その他の演算を入れ子にする括弧を使用する必要があります。以下の例では、期待される結果が得られます。

  SET x=1,y=0
  IF (x=1) ! (y=0) {WRITE "TRUE"}
  ELSE {WRITE "FALSE" } 
  // Returns 1 (TRUE)

論理演算子

ObjectScript は、以下の論理演算子を提供します。

否定 (')

否定演算子は、ブーリアン型オペランドの真偽値を反転します。オペランドが True (1) の場合、否定演算子は False (0) になります。オペランドが False (0) の場合、否定演算子は True (1) になります。

例えば、以下の文は False (0) の結果を返します。

  SET x=0
  WRITE x

"否定 (')" のリファレンス・ページを参照してください。

論理積 (& または &&)

論理積演算子は、オペランドの両方の値が True (1) であるかどうかを判断します。オペランドが両方とも True の場合 (つまり、数値として計算した場合、ゼロ以外の値となる)、ObjectScript は、True (1) を返します。それ以外の場合、False (0) を返します。

論理積演算子には、以下の 2 つの形式があります。

  • & 演算子は、両方のオペランドを評価し、いずれかのオペランドの値がゼロの場合、False (0) を返します。それ以外は True (1) を返します。

  • && 演算子は、左のオペランドを評価し、そのオペランドの値がゼロの場合、False (0) を返します。左のオペランドがゼロ以外の場合にのみ、&& 演算子は右のオペランドを評価します。右のオペランドの評価がゼロの場合、False (0) を返します。それ以外は True (1) を返します。

以下の例は、2 つのゼロ以外のオペランドを True と評価して True (1) を返します。

 SET A=-4,B=1
 WRITE A&B // TRUE (1)

"論理積 (& または &&)" のリファレンス・ページを参照してください。また、"論理積否定 (NAND) ('&)" のリファレンス・ページも参照してください。

論理和 (! または ||)

論理和演算子は、いずれか一方のオペランドが True の値を持つ場合、あるいは両方のオペランドが True (1) の値を持つ場合、True (1) を返します。論理和演算子は、両方のオペランドが False (0) の場合にのみ False (0) を返します。

論理和演算子には、以下の 2 つの形式があります。

  • ! 演算子は、両方のオペランドを評価し、両方のオペランドの値がゼロの場合、False (0) を返します。それ以外は True (1) を返します。

  • || 演算子は、左のオペランドを評価します。左のオペランドがゼロ以外の値に評価された場合、|| 演算子は、右のオペランドを評価せずに True (1) を返します。左のオペランドがゼロの場合にのみ、|| 演算子は、右のオペランドを評価します。右のオペランドがゼロの場合、False (0) を返します。それ以外は True (1) を返します。

以下の例は、2 つの True の (ゼロではない) オペランドに論理和演算を実行し、True の結果を返します。

 SET A=5,B=7
 WRITE "A!B = ",A!B,! 
 SET A=5,B=7
 WRITE "A||B = ",A||B,!

"論理和 (! または ||)" のリファレンス・ページを参照してください。また、"論理和否定 (NOR) ('!)" のリファレンス・ページも参照してください。

文字列連結演算子 (_)

文字列連結演算子 (_) は、その 2 つのオペランドを文字列と解釈し、1 つ目の文字列に 2 つ目の文字列を追加した文字列値を返します。

以下の例では、現在のデバイスに文字列 Highchair を書き込みます。

  WRITE "High"_"chair"

詳細は、"文字列の連結 (_)" のリファレンス・ページを参照してください。

文字列関係演算子

文字列関係演算子は、オペランドを文字列として解釈してブーリアン値の結果を返します。文字列関係演算子は、否定論理演算子 (') を先頭に付けて、論理結果を反転することができます。ObjectScript は、以下の文字列関係演算子を提供します。

等価 (=)

等価演算子は、2 つのオペランドが文字列として等しいかを判断します。等価演算子を 2 つの文字列で実行すると、ObjectScript は、2 つのオペランドの文字順序が同一で、スペースを含め他の異なる文字を持たない同一の文字列の場合に True (1) を返します。それ以外の場合は False (0) を返します。以下に例を示します。

 WRITE "SEVEN"="SEVEN"    // 1
 WRITE "SEVEN"="seven"    // 0
 WRITE "SEVEN"=" SEVEN "  // 0

詳細は、"等価 (=)" のリファレンス・ページを参照してください。また、"不等価 ('=)" のリファレンス・ページも参照してください。

包含 ([)

包含演算子は、右のオペランドの一連の文字が、左の文字の部分文字列であるかを判断します。左のオペランドが、右のオペランドの文字列を含んでいる場合、結果は True (1) となります。左のオペランドが、右のオペランドの文字列を含んでいない場合、結果は False (0) となります。右のオペランドが NULL 文字列の場合、結果は常に True となります。

以下に例を示します。

 SET L="Steam Locomotive"
 SET S="Steam"
 WRITE L[S  /// 1

詳細は、"包含 ([)" のリファレンス・ページを参照してください。また、"非包含 ('[)" のリファレンス・ページも参照してください。

後続 (])

後続関係演算子は、左のオペランドの文字が、ASCII 文字順で右のオペランドの文字の後に来るかどうかを判断します。後続関係演算子は、両方の文字列が、それぞれの最左端の文字から始まるものとします。

以下に例を示します。

 WRITE "LAMPOON"]"LAMP"  // 1

詳細は、"後続 (])" のリファレンス・ページを参照してください。また、"非後続 ('])" のリファレンス・ページも参照してください。

前後関係 (]])

前後関係演算子は、左のオペランドが数値添え字の照合順序で右のオペランドの後に順番に並んでいるかを判定します。数値照合順序では、NULL 文字列が最初に置かれます。次に負数から数値順に並べたキャノニック形式の数値、ゼロ、整数と続き、最後に数値以外の値が置かれます。

以下に例を示します。

 WRITE 122]]2  // 1

詳細は、"前後関係 (]])" のリファレンス・ページを参照してください。また、"非前後関係 (']])" のリファレンス・ページも参照してください。

パターン・マッチング演算子 (?)

ObjectScript のパターン・マッチング演算子は、左オペランドの文字が、その右オペランドのパターンと正確に一致しているかどうかを判断します。

以下の例は、文字列 ssn に有効な米国社会保障番号 (数字 3 桁、ハイフン、数字 2 桁、ハイフン、数字 4 桁) が含まれているかどうかをテストします。

 SET ssn="123-45-6789"
 SET match = ssn ? 3N1"-"2N1"-"4N
 WRITE match

パターン構文およびその他の詳細は、"パターン・マッチング (?)" のリファレンス・ページを参照してください。

Note:

ObjectScript では、多くのソフトウェア・ベンダよりサポートされる (バリアントを用いた) パターン・マッチング構文である正規表現もサポートします。正規表現は、$LOCATE および $MATCH 関数と %Regex.MatcherOpens in a new tab クラスのメソッドで使用できます。詳細は、"正規表現" のリファレンス・ページを参照してください。

これらのパターン・マッチング・システムは完全に別個のものであり、異なるパターンとフラグを持つ異なる構文を使用します。

間接演算子 (@)

間接演算とは、コマンド行、コマンド、コマンド引数の一部あるいはすべてを、データ・フィールドの内容で、実行時にダイナミックに置換する手段です。

間接演算は、添え字間接演算の場合を除いて、間接演算子 (@) で指定され、以下の形式になります。

@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

詳細は、"間接 (@)" のリファレンス・ページを参照してください。

Note:

間接演算は、他の方法より能率的かつ汎用的にコーディングできますが、必ずしも使用する必要はありません。XECUTE コマンドなど他の方法を使用して、間接演算と同様の機能を常に実行できます。

FeedbackOpens in a new tab