Pregunta

En un imperativo, objeto orienta el lenguaje, tendría más sentido tener cierres mutables o inmutables?

Por ejemplo:

int i=5;
function() f={print(i);};
f();
i=6;
f();

Si el cierre es mutable, esto sería de impresión:

5
6

Si es inmutable, sería de impresión:

5
5

Me doy cuenta de que, incluso con cierres inmutables, todavía se podía hacer esto:

class I {int i;}
I i=new I();
i.i=5;
function() f={
    I j=i;
    print(j.i);
};
f();
i.i=6;
f();

Por lo tanto, sería mejor tener cierres mutables o inmutables, o tener la opción para ambos? cierres inmutables parecen más fáciles de poner en práctica, por lo que en este punto, creo que voy a ir con eso, a menos que haya una buena razón para no hacerlo.

¿Fue útil?

Solución

Los lenguajes imperativos suelen ser construido en torno al concepto de Estado. Por lo tanto, tiene más sentido para las características del lenguaje para reflejar que, incluidos los cierres. Sí, este comportamiento puede ser confuso a veces, pero es parte del problema y la ventaja de tener el estado de la aplicación.

Creo que la mejor prueba de este argumento es mirar algunos de los idiomas más recientes que tienen el apoyo de cierre. C # y VB.Net, lenguajes orientados a objetos imperativas, optó por tener cierres mutables. Mientras que F #, un lenguaje funcional, tiene cierres inmutables (que deriva principalmente de la idea de que F # es inmutable por defecto).

También lo que sería lo que realmente significa tener un cierre inmutable en un lenguaje imperativo? La mayoría de la gente piensa en esto como hacer las variables de sólo lectura equivalentes a C # 's. tipos valor seguro estarían protegidos frente a posibles modificaciones, pero ¿qué pasa con los tipos de referencia mutables. No sería capaz de cambiar el lugar donde la variable apuntada, pero que se podría llamar una función mutante y obtener un efecto similar. Por ejemplo.

class Student {
  public string Name { get; set; }
}

void Example() {
  var student = new Student() { Name = "foo" };
  Action() del = () => 
    { student.Name = "bar"; };
  del();
}

Esto podría ser implementado con un cierre inmutable como yo en realidad no modifico donde las variables apuntan. Sin embargo, estoy siendo claramente haciendo una operación de mutación.

Otros consejos

¿Deben las lenguas tienen lambdas que la captura por valor o por referencia de captura? Decidir por sí mismo, pero ver " En lambdas, capturar y mutabilidad " para obtener más comentarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top