En mi opinión, el poder de la pureza funcional se logra cuando las rutas de código profundas se pueden verificar como libres de efectos secundarios. ¿Cuáles son las experiencias de las personas en la escala del árbol de códigos que pueden estar dentro de un especificador puro, y qué ocurre con el nivel de reutilización del código?Programación funcional pura en D
Algunas cosas Manché:
std.algorithm
en su mayoría no se marca como pure
, pero potencialmente podría ser lo más puro posible, ya sea por una versión pura de algoritmos que exigen pureza de la función de creación de instancias o mixin, o bien por la pureza el propio especificador es polimórfico estático.
Los convertidores útiles como to!string(someInt)
no son actualmente puros.
estructuras definidas por el usuario parecen tener problemas (como se ilustra abajo) con:
1. destructores puros en una estructura anidada
2. una función postblit puro incluso en un struct no anidada
El código siguiente Actualmente da múltiples errores en la DMD 2.052 ganan 32 bits
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'
Gracias por sus comentarios. Observé la definición débil de pureza hace un tiempo cuando experimenté, y es claramente muy poderosa, permitiendo la programación de OO completamente mutable en código puro, y al crear thunks de evaluación diferida o programar promesas, etc. la forma fuerte puede afirmarse fácilmente por meta -programación en los calificadores de tipo. Creo que para que la visión altamente concurrente despegue realmente, mucho más debe ser capaz de estar dentro de un envoltorio puro. Los problemas de destructor y postblit que mencioné me están afectando más ya que necesito hacer una referencia de recuento en código puro, ¿cree que son errores? – John
@John: Sí, estos son probablemente errores. – dsimcha