На мой взгляд, сила функциональной чистоты заключается в том, что глубокие коды кода могут быть проверены как побочные эффекты. Что люди испытывают в масштабах дерева кодов, которые могут находиться внутри чистого спецификатора, и каков уровень повторного использования кода?
Несколько вещей, которые я заметил:
std.algorithm
в основном не помечен как pure
, но потенциально может быть в значительной степени чистым, либо чистой версией алгоритмов, требующих чистоты функции-экземпляра или mixin, либо самим спецификатором чистоты является статически полиморфным. < ш > Полезные преобразователи, такие как to!string( someInt )
, в настоящее время не чисты.
Созданные пользователем структуры, похоже, имеют проблемы (как показано ниже) с помощью:
1. Чистые деструкторы на вложенной структуре
2. чистая postblit-функция даже на не-вложенной структуре
Следующий код в настоящее время дает несколько ошибок в DMD 2.052, выигрывает 32-разрядный
struct InnerStruct
{
pure this(this) {}
pure ~this() {}
}
struct OuterStruct
{
InnerStruct innerStruct;
pure this(this) {}
pure ~this() {}
}
pure void somePureFunc()
{
OuterStruct s1 = OuterStruct(); // pure nested destructor does not compile
OuterStruct s2 = s1;
InnerStruct is1 = InnerStruct(); // pure non-nested destructor seems to compile
InnerStruct is2 = is1; // pure non-nested postblit does not compile
}
void main()
{
somePureFunc();
}
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '__cpctor'
pure_postblit.d(20): Error: pure function 'somePureFunc' cannot call impure function '__cpctor'
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '~this'
pure_postblit.d(17): Error: pure function 'somePureFunc' cannot call impure function '~this'