Programación funcional

D pone énfasis en la programación funcional proporcionando soporte de primera clase para el desarrollo siguiendo un estilo funcional.

En D una función se puede declarar como pura mediante la palabra reservada pure. Esto implica que dados los mismos parámetros de entrada, la salida siempre será la misma. Las funciones puras no pueden acceder ni cambiar ningún estado global que sea modificable, por lo que desde estas funciones sólo se permite llamar a otras funciones puras.

int add(int lhs, int rhs) pure {
    impureFunction(); // ERROR: no se puede llamar a una función impura.
    return lhs + rhs;
}

Esta variante de la función add se llama función pura fuerte (strongly pure function en inglés) ya que devuelve un resultado dependiendo sólo de sus parámetros de entrada sin modificarlos. D también permite definir funciones puras débiles (weakly pure functions en inglés) que pueden tener parámetros modificables.

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

Estas funciones todavía se consideran puras ya que no pueden acceder ni modificar ningún estado global. Sólo los parámetros que se le pasan se pueden modificar.

Debido a las restricciones impuestas por pure, las funciones puras son ideales para trabajar en entornos multihilo previniendo así condiciones de carrera por diseño. Además, las funciones puras se pueden poner en memorias caché permitiendo así al compilador un amplio rango de optimizaciones.

El compilador infiere automáticamente el atributo pure para funciones definidas mediante plantillas y para funciones cuyo valor de retorno se marca como auto donde sea aplicable (esto también es válido para código marcado como @safe, nothrow y/o @nogc).

En profundidad

rdmd playground.d