Funktionale Programmierung

D legt besonderen Wert auf funktionale Programmierung und bietet erstklassige Unterstützung für die Entwicklung im funktionalen Stil. In D kann eine Funktion als pure (dt.: rein, pur) deklariert werden, und so anzeigen, dass für eine Eingabe eine Ausgabe generiert wird, die nur von dieser abhängig ist. Reine (pure) Funktionen dürfen weder auf globale veränderliche Zustände zugreifen noch diese verändern und dürfen selbst nur Funktionen aufrufen, die ihrerseits als pure markiert sind.

int add(int lhs, int rhs) pure {
    // Fehler: impureFunction();
    return lhs + rhs;
}

Diese Variante von add wird als starke reine Funktion (engl.: strongly pure function) bezeichnet, weil ihr zurückgegebenes Ergebnis nur von den Eingangsparametern abhängt, ohne diese zu modifizieren. D erlaubt auch schwache reine Funktionen (engl.: weakly pure function), die veränderliche Parameter haben können:

void add(ref int result, int lhs, int rhs) pure {
    result = lhs + rhs;
}

Diese Funktionen werden immer noch als rein angenommen und können auf globale veränderliche Zustande weder zugreifen noch diese ändern. Nur Eingangsparameter dürfen Änderungen erfahren. Wegen der durch pure auferlegten Einschränkungen eignen sich reine Funktionen ideal für Multithreading-Umgebungen zur Vermeidung von Data-Racing. Auch können reine Funktionen einfach zwischengespeichert werden und erlauben eine Reihe von Optimierungen durch den Compiler.

Das Attribut pure wird für Template-Funktionen und auto-Funktionen automatisch vom Compiler abgeleitet (dies gilt auch für @safe, nothrow und @nogc).

Weiterführende Quellen

rdmd playground.d