Programmation fonctionelle

D accorde une grande importance à la programmation fonctionelle et intègre des mécanismes pour développer dans un style fonctionel.

En D, une fonction peut être déclarée pure, ce qui implique qu'à partir des mêmes paramètres, elle retournera toujours le même résultat. Les fonctions pures ne peuvent pas modifier ou accéder à une variable mutable et ne peuvent appeler que des fonctions qui sont elles-même pures.

int add(int gauche, int droite) pure
{
    // ERREUR: fonctionImpure();
    return gauche + droite;
}

Cette variante de add est appelée une fonction strictement pure parce qu'elle retourne un résultat qui dépend uniquement des paramètres en entrée, sans les modifier. D permet également de définir des fonctions non-strictement pures qui peuvent accepter des paramètres mutables:

void add(ref int resultat, int gauche, int droite) pure
{
    resultat = gauche + droite;
}

Ces fonctions sont quand même considérées pures et ne peuvent pas modifier ou accéder à des variables mutables de la portée globale. Seuls les paramètres mutables peuvent être modifiés.

De part les contraintes imposées par pure, les fonctions pures sont idéales pour les environnements parallélisés et rend les interblocages impossibles. De plus, les fonctions pures peuvent être facilement mises en cache et permettent des optimisations du compilateurs.

L'attribut pure est automatiquement déduit par le compilateur pour les modèles de fonctions et les fonctions auto si c'est possible (c'est aussi vrai pour @safe, nothrow et @nogc).

Pour aller plus loin

rdmd playground.d