ポストオペレーターの組み合わせ?
-
05-07-2019 - |
質問
私たちは皆、プリインクリメントおよびポストインクリメント演算子に精通しています。例えば、
c++; // c = c + 1
++c; // ditto
および「結合演算子」この原則を拡張します:
c += 5; // c = c + 5
s .= ", world"; // s = s . ", world"; e.g. PHP
「ポスト結合演算子」が必要になることがよくありました。これにより、次のことが可能になります。
s =. "Hello "; // s = "Hello " . s
明らかに、これは非可換演算子でのみ本当に有用であり、構文は借用されますが、意味はpre- / post-incrementから変更されます。
このような演算子を提供する言語を知っていますか?なぜそれはより一般的ではないのですか?
解決
この例に対する基本的な反対は、あいまいさを作成することです:
a=-5; //'a = -5' or 'a =- 5'?
b=*p; //'b = *p' or 'b =* p'?
c=.5; //'c = .5' or 'c =. 5'?
編集:しかし、いいえ、私はそれらを使用する言語を知りません。これはおそらく、他のほとんどの言語が基本的な演算子を派生させるためにCから省略されたためです。
そして、ええ、私は使用している言語でそれらを見てみたいです。
他のヒント
結合された「op =」演算子は、 var = var op predicate
の省略形ですが、opは特に何である必要はありません。 '。'
演算子は、たまたま" append"の省略形です。多くの言語で動作しますが、「追加」を定義するのを妨げるものは何もありません。操作—または、appendをprependに変更することもできます—使用したいデータ型(またはそのデータを含めるために使用する可能性のあるオブジェクト)で演算子をオーバーロードできる言語。 textvar == newtext
を textobj = textobj-> prepend(newtext)
の短縮形にしたい場合、あなたを止めるものは何もありません。
とはいえ、混乱を招くことなく既存の演算子を変更する方法はないため、おそらくこれを行うべきではありません。ステートメントの順序を左から右に変更したり、 unshift
などの特定の関数を使用してあいまいさのないものを追加したりできるように、文の順序を変更するのはかなり簡単です(より明確です)。
私が知っていることはありません。メタメタコマンドであるため、あるとは思いません。
説明するために、元の演算子(数値用)はCから来ており、マシンコード操作に直接マッピングされています。初期のコンパイラではできなかったため、これによりプログラマは最適化を行うことができました。
だから、
x=x+1;
and
x+=1;
and
x++;
3つの異なるアセンブラー出力を生成します。
現在、文字列に+ =を追加するのはメタコマンドです。オペコードにはマッピングされず、パターンに従って拡張されます。