Quanto sono utili gli operatori infix in un linguaggio di programmazione?


13

Quanto sono utili gli operatori infix in un linguaggio di programmazione? Valgono la complessità extra che forniscono? Potete fornire esempi in cui gli operatori infix sono più adatti al problema che non possono essere gestiti semplicemente sovraccaricando gli operatori normali?


5
Devi essere un Lisper. Ho ragione?
missingfaktor,

@missingfaktor: usato a malapena
Casebash il

1
In che modo gli operatori infix sono collegati al sovraccarico dell'operatore?
Rein Henrichs,

3
Vale la pena notare che la maggior parte delle lingue OO (ish) popolari usano infix per i nomi dei metodi. In effetti alcune lingue si estendono per consentire la scrittura di metodi "statici" come, diciamo, arg1.method(arg2)piuttosto che method(arg1, arg2).
Tom Hawtin -

Risposte:


16

Penso che gli operatori di infissi derivino dalla matematica.

Questo:

2 + 3 * 4

è più leggibile dalla maggior parte delle persone, di

(+ 2 (* 3 4))

perché molte persone hanno familiarità con la matematica.

Abbastanza interessante in Haskell puoi saltare tra infisso e prefisso. Questo utilizza la stessa funzione "(+)":

(+) 1 2
1 + 2

e questo sta usando la stessa funzione "elem":

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

Sovraccaricare gli operatori normali gestisce la maggior parte dei casi
Casebash,

1
@Casebash: anche quegli operatori "normali" a volte sono infissi.
liori,

2
Devo essere solo strano, perché trovo (+ 1 2) molto più leggibile di 1 + 2. Per lo meno (+ 1 2 3 4 5)è meglio di 1 + 2 + 3 + 4 + 5.
Joe D,

C'è anche RPN: spingere gli elementi, quindi l'operatore.
PhiLho,

@PhiLho Chiamato anche operatori postfix! In questo modo: 1 2 +o 1 2 3 4 5 +o più tipicamente per l'ultimo caso 1 2 + 3 + 4 + 5 +. In realtà c'è un bel vantaggio per quelli in quanto modella perfettamente un sistema basato su stack e raramente (se mai?) Ha bisogno di parentesi per regolare la precedenza dell'operatore.
CodexArcanum,

6

I linguaggi informatici sono progettati per gli esseri umani non per le macchine. E gli umani sono più usati per infettare operatori che pre o postfissi.


6

L'unica vera ragione per gli operatori infix è che gli umani in genere li trovano più facili da leggere. Ciò è in gran parte dovuto a due fatti:

  • Impariamo gli operatori infix sotto forma di matematica fin dalla tenera età e quindi abbiamo familiarità con loro: 2 * 2 = 4ecc.
  • Un operatore infisso ha il vantaggio di separare "visivamente" due argomenti. per esempio(some complex expression) + (some other complex expression)

Dal punto di vista logico / macchina, gli operatori infix non aggiungono davvero alcun valore e in alcuni casi sono un fastidio:

  • Puoi sempre convertire da infix a una chiamata di funzione equivalente con due argomenti - quindi gli operatori infix non sono mai più di "zucchero sintattico"
  • Infix può essere scomodo quando si desidera utilizzare più di due parametri. (* 1 2 3 4 5)in Lisp per esempio c'è probabilmente una sintassi molto più pulita per moltiplicare un insieme di numeri.
  • Dal punto di vista dell'analisi, è spesso utile leggere prima l'operatore in modo da sapere come interpretare il resto dell'espressione. Con gli operatori infix questo può essere molto più complesso (ad esempio è necessario mantenere uno stack o qualcosa di simile per capire quale operatore si applica a quali argomenti)
  • In linguaggi basati su stack / concatenativi come Forth, si desidera che l'operatore venga inserito per ultimo nello stack, in modo che abbia già gli argomenti nella posizione corretta. Ancora una volta, seppellire l'operatore nel mezzo di una sequenza di token complica solo le cose.
  • Gli operatori di Infix possono diventare davvero molto confusi quando sono sovraccarichi: cosa significa "+", ad esempio se applicato a due HashMap? Qui, la comprensione umana intuitiva dell'operatore infix funziona contro di te perché è facile assumere un significato che in realtà non era previsto .....

Penso che l'ultimo argomento sia falso. Spetta al programmatore utilizzare nomi sensibili per le funzioni, che si tratti di simboli o lettere.
Tom Hawtin - affronta

@ Tom - certo, i programmatori dovrebbero scegliere nomi sensibili. Ma uno dei criteri chiave per "sensato" è "le altre persone possono capirlo intuitivamente?" - Ho visto molti casi con sovraccarico dell'operatore in cui questo è lontano dal caso. Non voglio dover decodificare la definizione bizzarra di qualcuno di cosa significhi ">> =" quando applicato a un tipo di dati arbitrario. Nomi delle funzioni appropriate per favore!
Mikera,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.