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
).