Wie nützlich sind Infix-Operatoren in einer Programmiersprache?

12

Wie nützlich sind Infix-Operatoren in einer Programmiersprache? Sind sie die zusätzliche Komplexität wert, die sie bieten? Können Sie Beispiele nennen, in denen Infix-Operatoren besser für das Problem geeignet sind, das nicht durch einfaches Überladen der normalen Operatoren gelöst werden kann?

Casebash
quelle
5
Du musst ein Lisper sein. Habe ich recht?
Fehlender Faktor
@missingfaktor: Habe es kaum benutzt
Casebash
1
Wie hängen Infix-Operatoren mit der Überladung von Operatoren zusammen?
Rein Henrichs
3
Es ist erwähnenswert, dass die Mehrzahl der gängigen OO-Sprachen (ish) Infixe für Methodennamen verwenden. Tatsächlich gehen einige Sprachen zu einem gewissen Länge zu „statischen“ Methoden geschrieben werden , wie beispielsweise ermöglicht , arg1.method(arg2)statt method(arg1, arg2).
Tom Hawtin - Tackline

Antworten:

15

Ich denke, Infixoperatoren stammen aus der Mathematik.

Dies:

2 + 3 * 4

ist für die meisten Menschen besser lesbar als

(+ 2 (* 3 4))

weil die meisten Leute mit Mathematik vertraut sind.

Interessant genug in Haskell können Sie zwischen Infix und Präfix springen. Dies verwendet die gleiche Funktion "(+)":

(+) 1 2
1 + 2

und dies verwendet die gleiche Funktion "elem":

elem 42 [1,2,42]
42 `elem` [1,2,42]
LennyProgrammierer
quelle
Das Überladen normaler Bediener erledigt die meisten Fälle
Casebash,
1
@Casebash: Diese "normalen" Operatoren sind manchmal auch infixiert.
Liori
2
Ich muss einfach komischer sein als, weil ich (+ 1 2) viel besser lesbar finde als 1 + 2. Zumindest (+ 1 2 3 4 5)ist besser als 1 + 2 + 3 + 4 + 5.
Joe D
Es gibt auch RPN: Schieben Sie die Elemente, dann den Operator.
PhiLho
@PhiLho Auch Postfix-Operatoren genannt! So: 1 2 +oder 1 2 3 4 5 +eher typisch für den letzten Fall 1 2 + 3 + 4 + 5 +. Es hat tatsächlich den Vorteil, dass es ein Stack-basiertes System perfekt modelliert und selten (wenn überhaupt?) Klammern benötigt, um die Priorität des Operators anzupassen.
CodexArcanum
6

Computersprachen sind für Menschen gedacht, nicht für Maschinen. Und Menschen sind eher daran gewöhnt, Operatoren zu infizieren, als an Prä- oder Postfixes.

Gulshan
quelle
5

Der einzige wirkliche Grund für Infix-Operatoren ist, dass Menschen sie im Allgemeinen leichter lesen können. Dies ist hauptsächlich auf zwei Tatsachen zurückzuführen:

  • Wir lernen Infixoperatoren in Form von Mathematik von Kindesbeinen an und sind daher mit ihnen vertraut: 2 * 2 = 4usw.
  • Ein Infix-Operator hat den Vorteil, zwei Argumente "visuell" zu trennen. z.B(some complex expression) + (some other complex expression)

Aus logischer / maschineller Sicht bringen Infix-Operatoren keinen wirklichen Mehrwert und sind in einigen Fällen ein Ärgernis:

  • Sie können jederzeit mit zwei Argumenten von Infix zu einem äquivalenten Funktionsaufruf konvertieren - also sind Infix-Operatoren nie mehr als "syntaktischer Zucker".
  • Infix kann unpraktisch sein, wenn Sie mehr als zwei Parameter verwenden möchten. (* 1 2 3 4 5)in Lisp zum Beispiel ist wohl eine viel sauberere Syntax zum Multiplizieren einer Menge von Zahlen.
  • In Bezug auf die Syntaxanalyse ist es oft nützlich, zuerst den Operator zu lesen, damit Sie wissen, wie der Rest des Ausdrucks zu interpretieren ist. Bei Infix-Operatoren kann dies sehr viel komplexer sein (z. B. müssen Sie einen Stapel oder etwas Ähnliches pflegen, um herauszufinden, welcher Operator auf welche Argumente zutrifft).
  • In stapelbasierten / verketteten Sprachen wie Forth soll der Operator zuletzt auf den Stapel verschoben werden, damit die Argumente bereits an der richtigen Position sind. Das Vergraben des Bedieners in der Mitte einer Token-Sequenz erschwert die Sache.
  • Infix-Operatoren können in der Tat sehr verwirrend werden, wenn sie überladen sind. Was bedeutet "+", wenn sie beispielsweise auf zwei HashMaps angewendet werden? Hier wirkt sich das intuitive menschliche Verständnis des Infix-Operators negativ auf Sie aus, da es einfach ist, eine Bedeutung anzunehmen, die eigentlich nicht beabsichtigt war .....
mikera
quelle
Ich denke, das letzte Argument ist Schwindel. Es ist Sache des Programmierers, sinnvolle Namen für Funktionen zu verwenden, sei es mit Symbolen oder Buchstaben.
Tom Hawtin - Tackline
@Tom - sicher, sollten Programmierer sinnvolle Namen auswählen. Aber eines der Hauptkriterien für "sinnvoll" ist "können andere Menschen es intuitiv verstehen?" - Ich habe viele Fälle mit Überlastung des Bedieners gesehen, in denen dies nicht der Fall ist. Ich möchte nicht die verrückte Definition von ">> =" rückgängig machen müssen, wenn sie auf einen beliebigen Datentyp angewendet wird. Richtige Funktionsnamen bitte!
mikera