2013-01-11 19 views
5

Ich evaluiere noch, ob ich anfangen sollte, D für das Prototyping von numerischem Code in der Physik zu verwenden.Enthält D std lib etwas wie boost.fusion und boost.mpl?

Eine Sache, die mich stoppt, ist ich Boost, speziell Fusion und MPL.

D ist erstaunlich für Vorlage Meta-Programmierung und ich würde denken, dass es MPL und Fusion-Zeug tun kann, aber ich möchte sicher gehen.

Selbst wenn ich anfangen würde, d zu verwenden, würde es eine Weile dauern, bis ich auf die mpl-Ebene komme. Also möchte ich, dass jemand ihre Erfahrung teilt.

(von mpl i stl bedeuten Verwendung für Vorlagen und durch Fusion, ich meine stl für Tupel.)

ein Hinweis auf die Leistung zu schön wäre, da es in der Physik-Simulationen kritisch ist.

+0

Sie sollten nicht wirklich * Vorlage * Metaprogrammierung; D hat Kompilierfunktionsauswertung. – Mehrdad

+0

@Mehrdad für alles? Sie können Find_if oder Template-Parameter transformieren? –

+0

Nicht für alles (es sind immer noch Bugs zu beheben), aber für ziemlich viele Dinge. Es ist schwer, eine generische Antwort zu geben, aber wenn du ein bestimmtes Beispiel hast, poste es bitte und ich werde sehen, ob ich eine CTFE-Version davon finden und dir zeigen kann. – Mehrdad

Antwort

7

In D ist die Meta-Programmierung in den meisten Fällen nur Programmieren. Es gibt nicht wirklich eine Notwendigkeit für eine Bibliothek wie boost.mpl

Betrachten Sie zum Beispiel die Längen, die Sie in C++ gehen müssten, um ein Array von Zahlen zur Kompilierzeit zu sortieren. In D, tun Sie nur die offensichtliche Sache: std.algorithm.sort

import std.algorithm; 

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

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

Dies gibt [1, 2, 3] bei der Kompilierung verwenden. Hinweis: sort ist nicht in die Sprache integriert und hat absolut keinen speziellen Code zum Arbeiten zur Kompilierzeit.

Hier ist ein weiteres Beispiel, das eine Lookup-Tabelle für die Fibonacci-Sequenz zur Kompilierzeit erstellt.

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

Hier wird fibLUT benötigt vollständig zum Zeitpunkt der Kompilierung, wieder ohne besondere Kompilierung Code aufgebaut.

Wenn Sie mit Typen arbeiten möchten, gibt es einige Typenmetafunktionen in std.typetuple. Zum Beispiel:

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

Diese Bibliothek, glaube ich, enthält die meisten Funktionen, die Sie von Fusion erhalten können. Denken Sie jedoch daran, dass Sie in D nicht so viel Template-Metaprogrammiermaterial verwenden müssen wie in C++, da der Großteil der Sprache ohnehin zur Kompilierzeit verfügbar ist.

Ich kann die Leistung nicht wirklich kommentieren, weil ich nicht große Erfahrung mit beiden habe. Mein Instinkt wäre jedoch, dass die Kompilierzeit von D'schneller ist, weil Sie in der Regel nicht zahlreiche Vorlagen instanziieren müssen. Natürlich sind C++ - Compiler ausgereifter, daher könnte ich hier falsch liegen. Der einzige Weg, den Sie wirklich herausfinden werden, besteht darin, es für Ihren speziellen Anwendungsfall zu versuchen.