2011-09-18 9 views
7

Uno dei problemi, per alcuni di noi, con Javascript è la mancanza di sovraccarico dell'operatore. Questo rende difficile la scrittura di librerie numeriche. Ad esempio, potremmo scrivere qualcosa del tipo:Implementazione dell'overloading dell'operatore in Javascript tramite un transpiler

var a = new BigInteger(5); 
var b = new BigInteger(10); 
var c = a + b; 

Una possibile soluzione è quella di traspare una lingua con overloading dell'operatore in Javascript. Sebbene sia fattibile - sostituendo gli operatori con chiamate di funzione e controlli di tipo - il consenso sembra essere che ciò sia impossibile senza uccidere le prestazioni. CoffeeScript ha respinto l'idea per questo motivo:

https://github.com/jashkenas/coffee-script/issues/846

Ma ci sono davvero soluzioni intelligenti?

Ad esempio, potrebbe essere possibile eseguire verifiche di tipo di sollevamento con loop stretti o utilizzare un'altra pipeline in cui i compilatori JS moderni possono ottimizzare il cruft aggiunto quando i tipi sono numerici.

Idee?

+0

forse si potrebbe simulare la digitazione statica con notazione ungherese? Il tuo codice esploderà in modo spettacolare senza alcun messaggio di errore se mescolerai anche un solo tipo, naturalmente. – evan

+0

C'è un articolo qui. Sovraccarico dell'operatore JS ... http://www.2ality.com/2011/12/fake-operator-overloading.html –

risposta

1

Date un'occhiata come Scala implementato l'overloading degli operatori:

hanno definito che ogni operatore è una chiamata di metodo su un oggetto, così il vostro esempio potrebbe essere:

var c = a["+"](b); 

Se ci si ferma qui, si potrebbe implementare banalmente il sovraccarico del metodo, la funzione dovrebbe controllare i valori passati da param. Se vuoi sviluppare una soluzione migliore prendi Odersky's Programing in Scala e un po 'di tempo per leggere tutte le loro idee su come hanno risolto il problema (che è una soluzione molto bella!)

+1

Questo funziona solo se si sta riprogettando la lingua da zero (come nel caso di Scala). Non si può davvero trasformare un operatore monomorfico in uno polimorfo per capriccio :( – hugomg

2

Sei davvero sicuro di aver bisogno del tuo grande numeri per essere utilizzabili da vecchie funzioni scritte con numeri normali in mente (che usano gli operatori tradizionali)? Se hai solo bisogno del sovraccarico per le tue funzioni su cui controlli il controllo, potresti riuscire a cavartela usando un operatore personalizzato diverso da per bignums.

Ad esempio, si potrebbe scrivere un compilatore per convertire in modo sicuro

var d = a <+> b <*> c; 

in

var d = (a).add((b).multiply(c)); 

o forse, se si desidera che le conversioni automatiche ...

var d = toBignum(a).add(toBignum(b).multiply(toBignum(c))); 

Non ti vedo davvero ng in grado di forzare il sovraccarico su un'implementazione esistente senza grossi problemi. Mentre potresti teoreticamente sostituire tutte le occorrenze di + con < +> e così via, le attuali implementazioni di Javascript non sono ottimizzate per questo e non voglio nemmeno iniziare a pensare a cosa succederebbe se provassi a passare un bignum a uno dei nativi Funzioni C++ che sono sotto il cofano.


edit: Non dover sostituire la classe di base intero è il punto importante qui (notare come nel link che hai dato, ignorando è la prima cosa che il ragazzo vuole ...). Non penso che sarete in grado di trovare qualche tipo di ottimizzazione "magica" anche se non avete il controllo su quale delle molte implementazioni JS viene utilizzata dal client.

Se davvero non ti piace un operatore personalizzato come < +> l'unico modo per distinguere un normale operatore + (non devi intromettermi) da un operatore di fantasia + (vuoi fare cose bignum con) sarebbe forzare una sorta di sistema di battitura ad hoc su Javascript, magari tramite commenti, sintassi personalizzata o (come menzionato in un commento) notazione ungherese. Basta accontentarsi di un nome di operatore personalizzato che odi di meno sarebbe meno hacker, IMO.

+0

Non sono interessato alle vecchie funzioni Javascript e la nuova sintassi come <+> è troppo di un trucco per i miei gusti, poiché + è ciò che si intende. La mia speranza è che ci sia qualche ottimizzazione nota nel compilatore che può essere sfruttata – Tristan

+0

Modificata la risposta ... – hugomg

Problemi correlati