Мова D акцентує увагу на функціональному програмуванні і забезпечує першокласну підтримку розробки у функціональному стилі.
У мові D функція може бути оголошена як pure (чиста)
, вказуючи на те,
що однакові вхідні параметри завжди генерують однаковий результат.
Функції pure
не можуть отримувати доступ або змінювати будь-який
глобальний стан. Таким чином, вони мають здатність викликати
інші функції, які також є pure
.
int add(int lhs, int rhs) pure {
// ПОМИЛКА: неможливо викликати impureFunction тут
// impureFunction();
return lhs + rhs;
}
Цей варіант функції add
називається дуже чиста функція, адже вона
повертає результат, залежний тільки від її вхідних параметрів, які при
цьому залишаються незмінними. Мова D також дозволяє визначати слабо
чисту функцію, яка може мати змінні параметри:
void add(ref int result, int lhs, int rhs) pure {
result = lhs + rhs;
}
Ці функції, як і раніше, вважаються чистими і не можуть мати доступу або змінювати будь-який змінний глобальний стан. Лише передані змінні параметри можуть бути змінені.
Враховуючи обмеження, накладені функцією pure
, чисті функції ідеально
підходять для використання багатопоточного середовища для запобігання
перегонів за даними (data races) за визначенням (by design). Крім
того, чисті функції легко кешуються і уможливлюють ряд компіляторних
оптимізацій.
Атрибут pure
автоматично приймається компілятором для шаблонних
функцій і функцій auto
, де це можливо (це також відноситься до модулів
@safe
,nothrow
, і @nogc
).