Domanda

Conosciamo tutti bene gli operatori pre e post-incremento, ad es.

c++;    // c = c + 1
++c;    // ditto

e gli "operatori combinati" che estendono questo principio:

c += 5;    // c = c + 5
s .= ", world";    // s = s . ", world"; e.g. PHP

Ho spesso avuto bisogno di un "operatore post-combinato", che consentirebbe:

s =. "Hello ";    // s = "Hello " . s

Ovviamente, questo è davvero utile solo con operatori non commutabili e il significato è alterato dal pre / post-incremento, anche se la sintassi è presa in prestito.

Sei a conoscenza di una lingua che offre un tale operatore e perché non è più comune?

È stato utile?

Soluzione

Un'obiezione di base all'esempio dato è che creerebbe ambiguità:

a=-5;    //'a = -5' or 'a =- 5'?
b=*p;    //'b = *p' or 'b =* p'?
c=.5;    //'c = .5' or 'c =. 5'?

Modifica: Ma no, non sono a conoscenza di alcuna lingua che li usi. Presumibilmente ciò è dovuto al fatto che sono stati omessi da C da cui la maggior parte delle altre lingue deriva i loro operatori di base.

E sì, mi piacerebbe vederli nelle lingue che uso.

Altri suggerimenti

Gli operatori 'op =' combinati sono una scorciatoia per var = var op predicate , ma op non deve essere nulla in particolare. L'operatore '.' sembra essere una scorciatoia per un " append " operazione in diverse lingue, ma non c'è nulla che ti impedisca di definire un "prepend" operazione - o persino cambiando append per anteporre - in qualsiasi lingua che consenta di sovraccaricare un operatore su qualunque tipo di dati con cui vuoi lavorare (o su qualsiasi oggetto che potresti usare per contenere quei dati in altro modo). Se vuoi creare textvar / = newtext per abbreviazione di textobj = textobj- > prepend (nuovo testo) non c'è niente che ti fermi.

Detto questo, probabilmente non dovresti mai farlo, poiché non c'è modo di cambiare un operatore esistente senza creare un sacco di confusione. È sostanzialmente più semplice (e più chiaro) modificare l'ordine delle istruzioni in modo da poter andare da sinistra a destra o utilizzare una funzione specifica come unshift per anteporre le cose senza alcuna ambiguità.

Nessuno che io conosca e non penso che ci sarà, in quanto è un meta-meta-comando.

Per spiegare, gli operatori originali (per i numeri) provenivano da C dove si associavano direttamente alle operazioni del codice macchina. Ciò ha consentito al programmatore di eseguire l'ottimizzazione, poiché il compilatore iniziale non lo ha fatto Così,

x=x+1;

e

x+=1;

e

x++;

genererebbe tre diverse uscite assembler.

Ora, aggiungere + = per stringa è un meta-comando. Non si associa a un codice operativo, segue solo ed estende il modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top