Sarebbe una buona idea lavorare su come consentire alle persone di aggiungere matrici di numeri in javascript?

1

Sono un programmatore molto matematicamente orientato, e mi capita di fare un sacco di script java in questi giorni. Sono davvero deluso dagli aspetti matematici di javascript:

  • l'oggetto Math è quasi uno scherzo perché ha così pochi metodi
  • non puoi usare ^ per l'esponenziazione
  • l'operatore + è molto limitato, non puoi aggiungere array di numeri o fare moltiplicazione scalare sugli array

Ora ho scritto alcune estensioni piuttosto semplici all'oggetto Math e ho preso in considerazione la possibilità di scrivere una libreria di funzioni matematiche avanzate, sorprendentemente non sembra esistere alcun tipo di libreria standard già disponibile per il calcolo, sebbene ce ne sia una per vettori e matrici che ho trovato.

La notazione per lavorare con vettori e matrici è davvero brutta quando non si può usare l'operatore + sugli array, e non si può fare la moltiplicazione scalare. Ad esempio, ecco un'espressione orribile per sottrarre due vettori, A - B:

Math.vectorAddition(A,Math.scalarMultiplication(-1,B));

Ho cercato un qualche tipo di progetto open-source per contribuire per un po 'e anche se il mio C ++ è un po' arrugginito mi piacerebbe molto entrare nel codice per il motore V8 ed estendere l'operatore + al lavoro sugli array, per far funzionare la moltiplicazione scalare, e possibilmente per ottenere che l'operatore ^ lavori per l'esponenziazione. Queste cose migliorerebbero notevolmente l'utilità di qualsiasi framework javascript matematico.

Non so davvero come essere coinvolto in qualcosa come il motore V8 oltre a scaricare il codice e iniziare a lavorarci. Ovviamente temo che, dal momento che V8 è specifico per il cromo, che senza la cross-compatibilità del browser un cambiamento fondamentale di questo tipo rischia di essere rifiutato per V8. Speravo che qualcuno potesse dirmi perché questa è una cattiva idea, oppure darmi qualche suggerimento su come procedere a questo punto per ottenere qualche tipo di approvazione per aggiungere queste funzionalità.

Grazie!

    
posta OneThreeSeven 18.11.2012 - 23:06
fonte

2 risposte

3

Il tuo codice non è troppo propenso a trovare la sua strada in V8. È un cambio di lingua e i cambiamenti di lingua avvengono solo raramente, e se lo fanno, di solito è perché un'azienda, piuttosto che una persona o anche una comunità, sta spingendo per loro.

Quindi ... a meno che tu non voglia allenare i tuoi muscoli VM, proverei a rimanere nella lingua.

    
risposta data 19.11.2012 - 00:27
fonte
1

Hai colpito le due cose che in realtà mi tormentano su JS a volte. Numeri Wimpy e nessun sovraccarico dell'operatore. Uno dei punti di forza di JS è tuttavia la facilità di creare un'interfaccia meno noiosa rispetto alle interfacce forse più prolisse e autodocumentanti delle funzionalità di base (o qualsiasi interfaccia icky di cui non si voglia occuparsi). Ecco una semplice interfaccia di collegamento a catena che ho montato. Penso che preferirei semplicemente aggiungere un metodo e una catena di sottrazione se necessario, ma quando vedrà un '-' sottrarrà il successivo vettore arg e i suoi argomenti saranno anche sovraccaricati per gestire l'eliminazione di un oggetto vettoriale di interfaccia direttamente così roba come questa dovrebbe lavoro:

var vec1 = $v([1,2,3]);

vec1.val();//[1,2,3];
vec1.add([1,1,1],[1,1,1]).val();// [3,4,5]
vec1.add('-',[2,2,2]).val();// [1,2,3]

var vec2 = $([3,2,1]).add(vec1,[1,1,1],'-',[2,2,2]).val(); // [5,5,5]

E la funzione:

function $v(vector){ //produce basic chaining add/subtract wrapper

    return new VectorInterface(vector);

    function VectorInterface(vectorVal){

        if(!validateVector(vectorVal)){
            vectorVal = [0,0,0]; //no idea if you would want this as a default
        }
        //vectorVal is persistent

        //I use function hoisting to keep interface declaration clean
        this.val = val;
        this.add = add;
        //this.subtract = subtract; //so we can subtract without cheesy '-' args later

        //public methods

        function val(){
            return vectorVal;
        }

        function add(){
            var
                argLen = arguments.length,
                mod = 1
            ;

            for(var i=0; i < argLen; i++){

                var thisArg = arguments[i];

                if(thisArg.constructor.name === VectorInterface){
                    thisArg = thisArg.val();
                } 

                if(validateVector(thisArg)){
                    vectorVal[0]+= mod * thisArg[0];
                    vectorVal[1]+= mod * thisArg[1];
                    vectorVal[2]+= mod * thisArg[2];
                    mod = 1;
                }
                else if(thisArg='-'){ 
                    mod=-1;
                }
            }
            return this; //make it chainable for addition of other methods
        }


        //internal
        function validateVector(vec){
            if((vec !== undefined) && (vec.length !== undefined) && ( vec.length === 3 )){
                return true;
            }
            else { return false; }
        }
    };

}

Non sarebbe così difficile aggiungere altri metodi di operatore o sovraccaricare ulteriormente gli arg per identificare array di vettori di array e masticarli attraverso gli appropriati quando aggiunti agli argomenti.

    
risposta data 15.11.2013 - 23:28
fonte

Leggi altre domande sui tag