2013-01-11 23 views
5

Nadal oceniam, czy powinienem zacząć używać D do prototypowania kodu numerycznego w fizyce.Czy D std lib zawiera coś takiego jak boost.fusion i boost.mpl?

Jedną z rzeczy, która mnie powstrzymuje, jest podniecenie, szczególnie fuzja i mpl.

D jest niesamowite dla meta-programowania szablonów i myślę, że potrafi robić rzeczy mpl i fusion, ale chciałbym się upewnić.

Nawet jeśli zacznę używać d, zajęłoby mi trochę czasu, aby dostać się do poziomu mpl. Chciałbym, żeby ktoś podzielił się swoim doświadczeniem.

(przez MPL Znaczy użyciu szablonów i STL w wyniku fuzji, to znaczy STL za krotki.)

notatka na wydajność byłaby zbyt miły, ponieważ jest to krytyczne w symulacji fizyki.

+0

Nie powinieneś naprawdę potrzebować * szablonu * metaprogramowania; D ma funkcję oceny czasu kompilacji. – Mehrdad

+0

@Mehrdad na wszystko? możesz zrobić find_if lub przekształcić parametry szablonu? –

+0

Nie na wszystko (są jeszcze błędy do naprawienia), ale na wiele rzeczy. Trudno podać ogólną odpowiedź, ale jeśli masz konkretny przykład, opublikuj go, a zobaczę, czy uda mi się znaleźć jego wersję CTFE i pokazać. – Mehrdad

Odpowiedz

7

W D, w przeważającej części, meta-programowanie to tylko programowanie. Nie ma potrzeby korzystania z biblioteki takiej jak boost.mpl

Weźmy na przykład długość, którą trzeba przejść do C++, aby posortować tablicę liczb podczas kompilacji. D, po prostu zrobić to oczywistą rzeczą: użyj std.algorithm.sort

import std.algorithm; 

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

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

ten wypisuje [1, 2, 3] w czasie kompilacji. Uwaga: sort nie jest wbudowany w język i nie ma absolutnie żadnego specjalnego kodu do pracy w czasie kompilacji.

Oto kolejny przykład, który tworzy tabelę odnośników dla sekwencji Fibonacciego podczas kompilacji.

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(); 

Tutaj fibLUT jest wykonana w całości w czasie kompilacji, ponownie bez specjalnej kompilacji kodu czasu potrzebnego.

Jeśli chcesz pracować z typami, istnieje kilka typów funkcji meta w std.typetuple. Na przykład:

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

Ta biblioteka, jak sądzę, zawiera większość funkcji, które można uzyskać z Fusion. Pamiętaj jednak, że naprawdę nie musisz używać wielu szablonów meta-programowania w D tak bardzo jak w C++, ponieważ większość języka jest dostępna w czasie kompilacji.

Nie mogę naprawdę wypowiedzieć się na temat występu, ponieważ nie mam dużego doświadczenia z obydwoma. Jednak moim instynktem byłoby to, że wykonanie kompilacji D's jest szybsze, ponieważ generalnie nie ma potrzeby tworzenia instancji wielu szablonów. Oczywiście kompilatory C++ są bardziej dojrzałe, więc mógłbym się mylić. Jedynym sposobem, który naprawdę się dowiesz, jest wypróbowanie go w konkretnym przypadku użycia.