На мой взгляд, сила функциональной чистоты заключается в том, что глубокие пути кода могут быть проверены как свободные от побочных эффектов.Каков опыт людей в масштабе дерева кода, которое может быть внутри чистого спецификатора, и каков уровень повторного использования кода?
Несколько вещей, которые я заметил:
std.algorithm
- этов большинстве случаев не помечен как pure
, но потенциально может быть в значительной степени чистым либо из-за чистой версии алгоритмов, требующих чистоты создаваемой функции или mixin, либо из-за того, что сам спецификатор чистоты является статически полиморфным.* в настоящее время не являются чистыми.
Кажется, что определенные пользователем структуры имеют проблемы (как показано ниже) с:
1. чистыми деструкторами во вложенной структуре
2. чистой постблит-функцией даже наnon-nested struct
Следующий код в настоящее время выдает несколько ошибок в DMD 2.052 win 32-bit
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'