D особо выделяет функциональное программирование, и предоставляет встроенную поддержку для разработки в функциональном стиле.
В D функцию можно объявить как pure
, что означает,
что при одних и тех же параметрах, всегда возвращается
один и тот же результат. pure
-функции не могут
обращаться к или изменять глобальное состояние, и поэтому
могут вызывать только другие функции, помеченные как pure
.
int add(int lhs, int rhs) pure {
// ОШИБКА: impureFunction();
return lhs + rhs;
}
Такой вариант функции add
называется сильно-чистой функцией,
поскольку возвращает результат, зависящий только от параметров,
и не изменяет сами параметры. D так же позволяет определять
слабо-чистые функции, которые могут иметь изменяемые
параметры:
void add(ref int result, int lhs, int rhs)
pure {
result = lhs + rhs;
}
Такие функции всё ещё считаются чистыми, и не могут обращаться к или изменять глобальное состояние, а только лишь переданные изменяемые параметры.
Благодаря ограничениям, накладываемым pure
, чистые функции
идеально подходят для многопоточных сред, поскольку
предотвращают состояние гонки по дизайну.
В дополнение к этому, результаты чистых функций
легко поддаются кэшированию, что открывает ряд
возможностей для оптимизации во время компиляции.
Атрибут pure
автоматически вычисляется компилятором
для шаблонных и auto
-функций, если это возможно
(это так же справедливо для @safe
, nothrow
, и @nogc
).