Mは、単項と二項の両方の演算子を持ちます。
すべての単項演算は、右から左へ優先順位があります。
全てのMのバイナリ演算は、厳密は左から右へ優先順位があります。これは、すべての論理演算、文字列演算、算術演算、を含みます。操作の階層は、括弧 () を使用して優先順位を明示的に確立することが必要です。このルールは反直感的ですが、それは覚えやすく、例外は全くありません。
すべての算術演算子は、数値として適用される式を評価するためにMに強制します。算術演算子は:
+ は、単項演算子としては、数値としてそれに続く式を評価するために単にMに強制します。二項演算子としては、加算を実行するためにMを引き起こします。
-は、単項演算子としては、マイナスに続く式を負の数としてMを引き起こします。二項演算子としては、減算を実行するためにMを引き起こします。
* は、掛算の二項演算子です。
** は、指数の二項演算子です。
/ は、除算の二項演算子です。
\ は、整数除算の二項演算子です。
# は、モジュロの二項演算子で、すなわち、Mは最初の引数を2番目の引数で整数除算した剰余を生成することをMに引き起こします。
すべての算術演算子は、左から右への優先順位となることを覚えておいてください。
例:
GTM>WRITE 1+1 2 GTM>WRITE 2-1 1 GTM>WRITE 2*2 4 GTM>WRITE 3**2 9 GTM>WRITE 4/2 2 GTM>WRITE 7 2 GTM>WRITE 7#3 1 GTM>
この単純な例では、どのように数値リテラルで各算術二項演算子を使用するかを示しています。
例:
GTM>WRITE +"12ABC" 12 GTM>WRITE --"-3-4" -3 GTM>
最初のWRITEは、文字列リテラルの評価を数値に強制して単項演算子のプラス記号(+)の操作を表します。2番目のWRITEは、単項演算子のマイナス記号( - )を 示しています。文字列リテラル内の2番目のマイナス記号は、減算を発生しないことではなく、マイナス3(-3)の結果として数値評価を終了することに、注意してください。それぞれの先のマイナス記号は、1つの負数を引き起こし、したがって、結果は負の値の3(-3)です。
論理演算子は、常に、TRUE(1) またはFALSE(0)の結果を生成します。すべての論理演算子は、真理値として適用される式を評価するためにMに強制します。論理演算子は:
' 単項NOT演算子は、現在の真理値の否定です。Mは関係演算子に接してNOT演算子の配置を受け入れます。例えば、A'=B は、'(A=B)として意味します。
& 二項AND演算子は、両方の式が真のみ、真の結果を生成します。
!二項OR演算子は、どちらか一方が真の場合に、真の結果を生成します。
優先順位は常に左から右へであり、その論理演算子は他のすべての演算子と同じ優先順位を持っていることを、覚えておいてください。
例:
GTM>WRITE '0 1 GTM>WRITE '1 0 GTM>WRITE '5689 0 GTM>WRITE '-1 0 GTM>WRITE '"ABC" 1 GTM>
上記の例では、単項NOT演算を示します。非ゼロの数値が真であり、否定が偽であることに、注意してください。
例:
GTM>WRITE 0&0 0 GTM>WRITE 1&0 0 GTM>WRITE 0&1 0 GTM>WRITE 1&1 1 GTM>WRITE 2&1 1 GTM>WRITE 0!0 0 GTM>WRITE 1!0 1 GTM>WRITE 0!1 1 GTM>WRITE 1!1 1 GTM>WRITE 2!1 1 GTM>
上記の例では、二項論理演算子によりカバーされたすべてのケースを示しています。
すべての文字列演算子は、文字列として適用する式を評価するためにMに強制します。文字列演算子は:
_ 二項演算子は、最初の式で2番目の式を連結させるためにMを引き起こします。
例:
GTM>WRITE "B"_"A" BA GTM>WRITE "A"_1 A1 GTM>
上記の例では、Mの連結を示しています。
M関係演算子は常に、TRUE(1) またはFALSE(0)の結果を発生します。すべての数値関係演算子は、数値として適用される式を評価するためにMに強制します。数値関係演算子は:
> 大なり小の二項算術演算子
< 小なり大の二項算術演算子
等号(=)は、数値評価を強制しません、そして文字列演算子として扱われる必要があります。しかし、2つの数値の間の等号記号は、数値として等しいかどうかテストします。
その他の数値関係演算は、次のように、論理NOT演算子のアポストロフィ(')を使用してフォーマットされます:
'> は、より大きくない、つまり、より小さいか等しい(以下)です。
'< はより小さくない、つまり、より大きいか等しい(以上)です。
>= はより大きく、または、等しいです。つまり、より小さくない( '< と同じ)。
<= はより小さく、または、等しいです。つまり、より大きくない( '> と同じ)。
'= 等しくない、数値または文字列の操作で使われます。
例:
GTM>WRITE 1>2 0 GTM>WRITE 1<2 1 GTM>
上記の例では、基本的な演算関連操作をを示しています。
例:
GTM>WRITE 1'<2 0 GTM>WRITE 2'<1 1 GTM>
上記の例では、論理NOT演算子を使って、算術演算、関係演算の組み合わせを示します。
M関係演算子は常に、TRUE(1) またはFALSE(0)の結果を発生します。すべての文字列関係演算子は、文字列として適用する式を評価するためにMに強制します。文字列関係演算子は:
= 二項演算子(二項等値演算子 )は、式が等しい場合に、TRUE(1)を返します。
[ 二項演算子(二項包含関係演算子)は、1番目の式が2番目の式の中の文字順シーケンスを含んでいる場合に、TRUE(1)を返します(部分一致)。
] 二項演算子(二項後続関係演算子 )は、1番目の式が、デフォルトでASCIIである文字エンコード順で、辞書的に2番目の式の後に来る場合、TRUE(1)を返します。
]] 二項演算子(二項前後関係演算子 )は、1番目の式が、添字の照合順序で、2番目の式の後に、辞書的に順番に並んでいる場合に、TRUE(1)を返します。
空でないすべての文字列が、辞書的に空の文字列の後に続き、すべての文字列には、空の文字列が含まれていることに、注意してください。
その他の文字列関係演算は、次のように、論理否定演算子(NOT)のアポストロフィ(')を使用してフォーマットされます:
'[ (非包含演算) は、含まれません。
'] (非後続演算) は、辞書的により小さいか等しい、つまり、後続しません。
']] (非前後関係演算 ) は、添字の照合順序で辞書的により小さいか等しい、つまり、辞書的に順番に並んでいない。
'= 等しくない、数値または文字列の操作で使われます。
例:
GTM>WRITE "A"="B" 0 GTM>WRITE "C"="C" 1 GTM>WRITE "A"["B" 0 GTM>WRITE "ABC"["C" 1 GTM>WRITE "A"]"B" 0 GTM>WRITE "B"]"A" 1 GTM>WRITE "A"]]"B" 0 GTM>WRITE "B"]]"A" 1
これらの例は、文字列リテラルを使用して文字列の関係演算子を示しています。
例:
GTM>WRITE 2]10 1 GTM>WRITE 2]]10 0 GTM>WRITE 0]"$" 1 GTM>WRITE 0]]"$" 0
これらの例では、プライマリのASCII文字セットを使用する時に、( ] ) 演算子の "後続(follows)"と (]]) 演算子の "後に順序よく並ぶ(sort-after)" との主な違いは、それらを数字として扱う方法であることを、示しています。
例:
GTM>WRITE 1=1 1 GTM>WRITE 1=2 0 GTM>WRITE 1="1" 1 GTM>WRITE 1=01 1 GTM>WRITE 1="01" 0 GTM>WRITE 1=+"01" 1 GTM>
これらの例では、等号演算子の二面性を示しています。両方の式が文字列または数値のどちらかである場合、結果は単純です。しかし、式が混在しているときに、ネイティブである文字列データタイプが優先されます。
例:
GTM>WRITE "a"'="A" 1 GTM>WRITE "FRED"'["RED" 0 GTM>WRITE "ABC"']"" 0
これらの例は、NOT演算子と文字列関係演算子の組み合わせを示しています。
パターンマッチ演算子 ( ? ) は、もし演算子より前の式が演算子より後のパターンで記述された特性と一致する場合、MにTRUEを返します。パターンは式ではありません。
パターンは2つの要素から成ります:
繰り返し回数
パターンコード、文字列リテラルまたは交互のリスト
パターンマッチ演算子より後に続く要素は、正当なパターンを評価する要素に続く間接演算子で成る場合があります。
繰り返し数は、単一の整数文字か、または、オプションで先頭と末尾の整数文字が加わったピリオド ( . ) 区切りかのどちらかで構成されています。単一の整数文字は、繰り返し回数を正確に指定します。ピリオド構文は先頭の数字が最小で末尾の数字が最大になる繰り返しの範囲を指定します。繰り返し回数で先頭の数字が欠落している時には、Mは最小値がない仮定します(すなわちゼロの最小値)。繰り返し回数で末尾の数字が欠落している時には、Mは繰り返し回数に上限を設けていません。
パターンコードは次のとおりです。
Aは、大文字もしくは小文字の英字
Cは、制御文字 ASCII 0から31と127
Eは任意の文字 ; パターンが制限されていない文字列の部分にあるすべての文字を渡すために使用されます。
L は小文字のアルファベット文字、ASCII 97から122
Nは、 0〜9の数字、ASCII 48から57
P 句読点、ASCII 32-47、58-64、91-96、123-126
U 大文字アルファベット文字、ASCII 65から90
パターンコードは、大文字または小文字になる可能性があり、リテラル文字列で置き換えることができます。GT.Mは、拡張または変更そして新しい patcode を追加ができるパターンコード(patcode) C、N、U、L、PのMパターンマッチ定義を可能にします(LまたはUの変更によってAのみ暗黙的に変更が可能)。この機能を有効にする解説については 第12章:" 国際化 " を参照してください。
注意 | |
---|---|
GT.Mコンパイラは、これら明示的に上記のように定義されたもの以外のパターンのコードを受け入れます。もし実行時にパターンコードが使われているようになっていてパターン定義がされていない場合、GT.Mはランタイムエラー(PATNOTFOUND)を発行します。GT.Mは現在、YとZのパターンのメカニズムを実装ていないし、コンパイル時の構文エラーのようなそれらを処理し続けていません。 |
例:
GTM>WRITE "ABC"?3U 1 GTM>WRITE "123-45-6789"?3N1"-"2N1"-"4N 1
1番目のWRITEは単純な一要素のパターンがあり、一方2番目はコードと文字列リテラルの両方を含む複数の要素があります。繰り返し回数のすべてが固定されています。
例:
I x?.E1C.E W !,"Must not contain a control character" Q
この例では、制御文字をテストするためのパターンマッチを使用しています。
例:
I acn?1U.20A1","1U.10A D .S acn=$G((^ACX($P(acn,","),$P(acn,",",2)))
この例では、"口座番号" が実際の名前であることを決定するために絶対的な最小値でパターンマッチを使用しています。^ACX のクロスインデックスに対応する口座番号のルックアップをトリガをしています。
パターンマッチ演算子は代替の構文を認めます。代替は、括弧 "()" で囲まれた patatoms (パターンアトム) のカンマ区切りリストが続く繰り返し回数で成ります。もしリストされたパターンのいずれかがオペランド文字列とマッチする場合、セマンティックはそのパターンマッチです。例えば、 ?1(2N1"-"7N,3N1"-"2N1"-"4N).1U は、社会保障番号や納税者IDのどちらかをマッチさせる方法かもしれません。代替が patatom を構築する方法の1つとして定義されているので、代替はネスト(再帰的に使用される)が可能です。
注意 | |
---|---|
複雑なパターンマッチを評価するには効率的ではないかもしれないので、あらゆる努力はパターンを使用して任意の一般的にシンプルに、そして、より効率的な代替ロジックの方が適切かどうかを判別するためになされるべきである。 |