Menu

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

Мова 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).

Поглиблення

rdmd playground.d