2013-01-11 11 views
5

Sto ancora valutando se dovrei iniziare a usare D per la prototipazione del codice numerico in fisica.La libreria D std include qualcosa come boost.fusion e boost.mpl?

Una cosa che mi ferma è che mi piace la spinta, in particolare la fusione e la mpl.

D è sorprendente per la meta-programmazione del modello e penso che possa fare cose di mpl e fusion, ma mi piacerebbe esserne sicuro.

Anche se inizierò a usare d, mi ci vorrà un po 'per arrivare al livello mpl. Quindi mi piacerebbe che qualcuno condividesse la loro esperienza.

(da MPL intendo Utilizzando STL per i modelli e per fusione, intendo STL per le tuple.)

una nota sulle prestazioni sarebbe bello troppo, dal momento che è fondamentale per simulazioni fisiche.

+0

Non dovresti veramente aver bisogno di * modello * metaprogrammazione; D ha una valutazione della funzione in fase di compilazione. – Mehrdad

+0

@ Mehrdad per tutto? puoi fare find_if o trasformare i parametri del modello? –

+0

Non per tutto (ci sono ancora bug da correggere), ma per un sacco di cose. È difficile dare una risposta generica, ma se si dispone di un particolare esempio, si prega di postarlo e vedrò se riesco a trovare una versione CTFE e mostrarlo. – Mehrdad

risposta

7

In D, per la maggior parte, la meta-programmazione è solo programmazione. Non c'è davvero alcun bisogno di una libreria come boost.mpl

Ad esempio, considerare le lunghezze in cui dovresti andare in C++ per ordinare una matrice di numeri in fase di compilazione. In D, basta fare la cosa più ovvia: utilizzare std.algorithm.sort

import std.algorithm; 

int[] sorted(int[] xs) 
{ 
    int[] ys = xs.dup; 
    sort(ys); 
    return ys; 
} 

pragma(msg, sorted([2, 1, 3])); 

Questo stampa [1, 2, 3] al momento della compilazione. Nota: sort non è incorporato nella lingua e non ha assolutamente alcun codice speciale per lavorare in fase di compilazione.

Ecco un altro esempio che costruisce una tabella di ricerca per la sequenza di Fibonacci in fase di compilazione.

int[] fibs(int n) 
{ 
    auto fib = recurrence!("a[n-1] + a[n-2]")(1, 1); 
    int[] ret = new int[n]; 
    copy(fib.take(n), ret); 
    return ret; 
} 

immutable int[] fibLUT = fibs(10).assumeUnique(); 

Qui, fibLUT è costruito interamente in fase di compilazione, ancora una volta senza alcun codice tempo di compilazione speciali.

Se si desidera lavorare con i tipi, esistono alcune metapodi di tipo in std.typetuple. Ad esempio:

static assert(is(Filter!(isUnsigned, int, byte, ubyte, dstring, dchar, uint, ulong) == 
       TypeTuple!(ubyte, uint, ulong))); 

Quella libreria, credo, contiene la maggior parte delle funzionalità che è possibile ottenere da Fusion. Ricorda, però, non hai davvero bisogno di usare molto materiale di meta-programmazione in D come in C++, perché la maggior parte della lingua è disponibile comunque in fase di compilazione.

Non posso davvero commentare le prestazioni perché non ho una vasta esperienza con entrambi. Tuttavia, il mio istinto sarebbe che l'esecuzione del tempo di compilazione di D'è più veloce perché generalmente non è necessario istanziare numerosi modelli. Certamente, i compilatori C++ sono più maturi, quindi potrei sbagliarmi qui. L'unico modo per scoprirlo è provarlo per il tuo caso d'uso specifico.

Problemi correlati