2011-01-08 48 views
14

Por lo que sé, evaluación entusiasta/orden de aplicación evalúa todos los argumentos a una función antes de aplicarlo, por otro lado, evaluación lenta/orden normal evalúa los argumentos solo cuando necesario.Eager evaluación/orden de aplicación y evaluación diferida/orden normal

Así que, ¿cuáles son las diferencias entre el par de términos de evaluación ansiosos y orden aplicativo y evaluación perezosa y orden normal?

Gracias.

Respuesta

8

La evaluación diferida evalúa un término como máximo una vez, mientras que el orden normal lo evaluaría con la frecuencia que aparezca. Entonces, por ejemplo, si tiene f(x) = x+x y lo llama como f(g(42)), entonces se llama a g(42) una vez bajo evaluación diferida o solicitud de orden, pero dos veces bajo el orden normal.

La evaluación entusiasta y el orden de aplicación son sinónimos, al menos cuando se usa la definición de orden de aplicación que se encuentra en Estructura e Interpretación de Programas de Computadora, que parece coincidir con la suya. (Wikipedia define el orden de aplicación de forma un poco diferente y lo tiene como un caso especial de evaluación entusiasta).

+1

Sí estoy leyendo * * SICP. Seguí el enlace de Wikipedia y encontré esto en [Evaluación diferida] (http://en.wikipedia.org/wiki/Lazy_evaluation): "La expresión nunca se evalúa más de una vez, llamada evaluación de solicitud de orden". ¿Eso significa que el orden aplicativo también podría usarse como un subtipo de evaluación perezosa? Estoy un poco confundido. –

+2

@Ryan: Aparentemente, la página "Evaluación diferida" utiliza una definición diferente de orden de aplicación que la página "Estrategia de evaluación". Creo que en este caso es mejor simplemente ignorar Wikipedia e ir con lo que dice el SICP. – sepp2k

+0

Gracias por su explicación. –

5

Estoy leyendo SICP también, y me ha llamado la atención la definición de orden normal dada por los autores. Parecía bastante similar a la evaluación Lazy para mí, así que fui en busca de más información con respecto a ambos.

Sé que esta pregunta fue hecha hace mucho tiempo, pero miré las preguntas frecuentes y no encontré ninguna mención de responder viejas preguntas, así que pensé en dejar lo que he encontrado aquí para que otras personas puedan usarlo en el futuro.

Esto es lo que he encontrado, y me inclino a estar de acuerdo con aquellos:

yo diría (al igual que otros) que la evaluación perezosa y NormalOrderEvaluation son dos cosas diferentes; la diferencia es aludida anteriormente. En la evaluación diferida, la evaluación del argumento es diferida hasta que sea necesaria, momento en el que se evalúa el argumento y se guarda su resultado (memorizado). Los usos adicionales del argumento en la función usan el valor calculado. Los operadores C/C++ ||, & &, y? : son ambos ejemplos de evaluación perezosa. (A menos que algún novato C/C++ programador es lo suficientemente daft sobrecargar & & o ||, en cuyo caso se evalúan las versiones sobrecargadas en orden estricto; por lo que la & & y || operadores deben nunca ser sobrecargados en C++)

En otras palabras, cada argumento se evalúa a lo sumo una vez, posiblemente no en absoluto.

NormalOrderEvaluation, por otra parte, reevalúa la expresión cada vez que se utiliza. Piense en las macros C, CallByName en los idiomas compatibles con , y la semántica de estructuras de control de bucle, etc. La evaluación de orden normal puede llevar mucho más tiempo que la evaluación de solicitud de pedido , y puede ocasionar efectos secundarios más de una vez. (Razón por la cual, por supuesto, las declaraciones con efectos secundarios generalmente debiera no ser dados como argumentos a macros en C/C++)

Si el argumento es invariante y no tiene efectos secundarios, la única diferencia entre los dos es el rendimiento. De hecho, en un lenguaje funcional puramente , la evaluación diferida se puede ver como una optimización de evaluación de orden normal. Con los efectos secundarios presentes, o las expresiones que pueden devolver un valor diferente cuando se vuelven a evaluar, los dos tienen comportamiento diferente; eval orden normal en particular, tiene una mala reputación en lenguajes de procedimiento debido a la dificultad del razonamiento acerca de tales programas sin ReferentialTransparency

También hay que señalar que la evaluación estricta orden (así como perezosos evaluación) se puede lograr en un lenguaje que admite la evaluación de orden normal a través de la memorización explícita. Lo opuesto no es verdad; requiere pasando thunks, funciones u objetos que pueden llamarse/enviarse como mensaje para aplazar/repetir la evaluación.

Y

La evaluación perezosa combina la evaluación de orden normal y compartir:

• evaluar Nunca algo hasta que tenga que (normal-orden)

• Nunca evaluar algo más de una vez (compartiendo)

http://c2.com/cgi/wiki?LazyEvaluation

http://cs.anu.edu.au/student/comp3610/lectures/Lazy.pdf

Cuestiones relacionadas