Menu

Функциональное программирование

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

Подробнее

rdmd playground.d