2010-12-07 21 views
5

Encuentro que una de las características más interesantes de Haskell y Perl6 es la capacidad de diferir el cálculo de valores hasta que realmente se necesiten.Ejemplos de técnicas de evaluación perezosa en Perl 5?

Perl5 por el contrario le gusta hacer todo de inmediato, pero por lo que puedo decir, contiene todas las primitivas necesarias para la evaluación perezosa. Estos son:

  • teniendo una referencia a @_ en una subrutina crea una referencia de matriz que está alias de los identificadores en la lista de parámetros, incluso si algunos de estos identificadores no contienen valores todavía.
  • devolviendo objetos sobrecargados/atados de tales subrutinas que contienen \@_ internamente, y luego eliminarlos cuando sea necesario. (Y hay varios módulos de CPAN que abstraer los detalles de unión/sobrecarga)

He estado experimentando con diversas técnicas de programación perezosos en Perl (Tengo un módulo en las obras que implementa un poco justo de la Haskell Preludio en Perl5 (cosas como la co-recursión: $_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs; para definir la secuencia de Fibonacci ya están funcionando)). Pero tengo la sensación de que hay algunos errores sutiles escondidos en el código que pueden manifestarse cuando las funciones se usan en expresiones/programas más grandes.

Así que me pregunto si hay algún buen ejemplo (CPAN/blogs/libros) que alguien conozca que emplee Haskell/Perl6 como la pereza en Perl5? En particular, me gustaría leer cualquier código de tamaño significativo que emplee este tipo de pereza.

Me gustaría también estar interesado en saber si alguien se ha topado con ningún trampas o problemas de difícil solución en torno a la implementación de la evaluación perezosa en Perl 5.

+3

Estoy asumiendo que usted ha leído orden superior Perl. Tiene mucho material sobre iteradores, flujos infinitos y pereza. –

Respuesta

9

Higher-Order Perl (disponible gratuitamente online) tiene un capítulo llamado "Infinite Streams". Tal vez ese sea un buen punto de partida.

3

Creo que el mayor problema es un "choque de Magics". Cuando tratas de hacer algo, piensas que es genial y algún otro autor del módulo está intentando algo que piensan que es espectacular y el resultado es indeterminación. ¿De quién gana la magia?

Como siempre se puede echar un vistazo detrás de la magia de otra variable, o incluso desencantarla inadvertidamente, la magia nunca es a prueba de balas.

Si pudieras lograr el 100% de ortogonalidad a través de exhaustivas pruebas de casos, es posible que puedas descansar más tranquilo ... tal vez.

+1

Si fuera realmente mágico, leería mi mente y DWIM. – Ether

+2

@Ether: quizás confunde * dweomer * con * DWIMMER *. :) – tchrist

6

Bueno, Moose hace con lazy loading of attributes:

predeterminados y constructor métodos
Los atributos pueden tener valores predeterminados y alces proporciona dos formas de especificar que por defecto.
[las opciones "predeterminado" y "generador" se describen ...]

pereza
Moose le permite aplazar la población atributo al hacer una atributo "perezosa":

has 'size' => (
    is  => 'ro', 
    lazy => 1, 
    builder => '_build_size', 
); 

Cuando "perezosa" es cierto, no se genera el valor por defecto hasta que se llama al método lector, en lugar de en el tiempo de construcción del objeto. Hay varias razones por las que puede elegir hacer esto.

En primer lugar, si el valor por defecto de este atributo depende de algunos otros atributos, el atributo debe ser "perezoso". Durante la construcción del objeto, los valores predeterminados no se generan en un orden predecible, por lo que no puede contar con que se llene otro atributo al generar un valor predeterminado.

En segundo lugar, a menudo no hay ninguna razón para calcular un valor predeterminado antes de que sea necesario. Hacer que un atributo sea "flojo" le permite diferir el costo hasta que el atributo sea necesario. Si el atributo nunca es necesario, ahorrará tiempo de CPU.

Recomendamos que haga de un atributo con un constructor o por defecto no trivial "perezosa", como una cuestión de rutina.

Cuestiones relacionadas