プログラミング言語で中置演算子はどのくらい便利ですか?


13

プログラミング言語で中置演算子はどのくらい便利ですか?彼らは彼らが提供する余分な複雑さに値しますか?通常の演算子をオーバーロードするだけでは処理できない問題に対して、中置演算子がより適している例を提供できますか?


5
あなたはLisperでなければなりません。私は正しいですか?
missingfaktor

@missingfaktor:やっとそれを使用
Casebash

1
中置演算子は、演算子のオーバーロードにどのように関連していますか?
ラインヘンリヒス

3
人気のあるOO(ish)言語の大半はメソッド名に中置記号を使用していることに注意してください。実際、いくつかの言語はには、「静的」方法は、たとえば、のように記述することができますいくつかの長さに行くarg1.method(arg2)のではなくmethod(arg1, arg2)
トムホーティン-タックライン

回答:


16

中置演算子は数学に由来すると思います。

この:

2 + 3 * 4

ほとんどの人にとってより読みやすい

(+ 2 (* 3 4))

ほとんどの人が数学に精通しているからです。

Haskellで十分興味深いのは、中置記号と接頭辞の間をホップできることです。これは同じ機能「(+)」を使用しています:

(+) 1 2
1 + 2

そして、これは同じ関数「elem」を使用しています:

elem 42 [1,2,42]
42 `elem` [1,2,42]

通常の演算子をオーバーロードすると、このほとんどのケースが処理されます
-Casebash

1
@Casebash:それらの「通常の」演算子も中置です。
リオリ

2
私は(+ 1 2) もっと奇妙なに違いありません、なぜなら私はよりも読みやすいと思うからです1 + 2。せめて(+ 1 2 3 4 5)よりも優れています1 + 2 + 3 + 4 + 5
ジョーD

RPNもあります:要素をプッシュしてから演算子をプッシュします。
ピロ

@PhiLho後置演算子とも呼ばれます!このように:1 2 +または1 2 3 4 5 +、より一般的には最後のケース1 2 + 3 + 4 + 5 +です。実際には、スタックベースのシステムを完全にモデル化し、演算子の優先順位を調整するために括弧を必要とすることはめったにないという点で、それらには素晴らしい利点があります。
CodexArcanum

6

コンピューター言語は、機械ではなく人間向けに設計されています。そして、人間は前置詞または後置詞よりも演算子を挿入するために使用されます。


6

中置演算子の唯一の本当の理由は、人間が一般的に読みやすいと感じるからです。これは主に2つの事実によるものです。

  • 私たちは幼い頃から数学の形で中置演算子を学び、したがってそれらに精通しています2 * 2 = 4
  • 中置演算子には、2つの引数を「視覚的に」分離するという利点があります。例えば(some complex expression) + (some other complex expression)

論理/マシンの観点からは、中置演算子は実際には値を追加せず、場合によっては迷惑になります。

  • 常に中置から2つの引数を持つ同等の関数呼び出しに変換できます-そのため、中置演算子は「構文糖」にすぎません
  • 3つ以上のパラメーターを使用する場合、Infixは不便な場合があります。(* 1 2 3 4 5)たとえば、Lispでは、一連の数値を乗算するための構文は間違いなくはるかにクリーンです。
  • 構文解析の観点から、式の残りの部分をどのように解釈するかを知るために、最初に演算子を読むと便利です。中置演算子を使用すると、これははるかに複雑になる可能性があります(たとえば、どの演算子がどの引数に適用されるかを把握するために、スタックまたは類似のものを維持する必要があります)
  • Forthなどのスタックベース/連結言語では、演算子を最後にスタックにプッシュして、引数がすでに正しい位置にあるようにします。繰り返しますが、オペレーターをトークンのシーケンスの中央に埋めることは、問題を複雑にするだけです。
  • 挿入演算子は、オーバーロードされると非常に混乱する可能性があります。たとえば、2つのHashMapに「+」を適用するとどうなりますか?ここでは、実際に意図されていない意味を推測するのは簡単だから、中置演算子の直感的な人間の理解はあなたに反しています。

最後の議論は偽りだと思います。シンボルを使用するか文字を使用するかに関係なく、関数に意味のある名前を使用するのはプログラマー次第です。
トムホーティン-タックライン

@Tom-プログラマーは理にかなった名前を選ぶべきです。しかし、「賢明」の重要な基準の1つは、「他の人が直感的に理解できるか」です。-私は、これがケースとは程遠い場所で、オペレーターのオーバーロードを伴うケースを見てきました。任意のデータ型に適用した場合の「>> =」の意味について、誰かの奇抜な定義をリバースエンジニアリングする必要はありません。適切な関数名を入力してください!
ミケラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.