algorithm - ¿Hay alguna diferencia entre la evaluación perezosa y la evaluación de cortocircuito?
terminology lazy-evaluation (1)
De Wikipedia:
En la teoría del lenguaje de programación, la evaluación perezosa es una estrategia de evaluación que retrasa la evaluación de una expresión hasta que se necesita su valor.
La evaluación de cortocircuito es:
La evaluación de cortocircuito, evaluación mínima o evaluación de McCarthy denota la semántica de algunos operadores booleanos en algunos lenguajes de programación en los que el segundo argumento solo se ejecuta o evalúa si el primer argumento no es suficiente para determinar el valor de la expresión
Entonces, ¿cuál es la diferencia entre ellos, por ejemplo, cuando tengo:
if(false && true && true) {
//boo
}
Por lo que sé, el compilador no ejecuta expresiones después de false
porque tengo &&
por lo que toda la expresión será finalmente false
. (¿Correcto?)
Entonces, ¿ese comportamiento se llama evaluación perezosa o evaluación de cortocircuito ?
La diferencia es que en el caso de una evaluación perezosa, una expresión se evalúa solo cuando es necesaria, mientras que en el caso de una evaluación de corto circuito, la evaluación se detiene justo después de conocer el resultado. Es una especie de nociones ortogonales.
La evaluación perezosa se puede aplicar a cualquier cálculo (el esquema de cortocircuito generalmente se usa solo con bools). No corta el cálculo inútil, pero retrasa todo el cálculo hasta que se requiera su resultado.
variable = bigAndSlowFunc() or evenSlowerFnc()
if (carry out heavy computations)
print "Here it is: ", variable
else
print "As you wish :-)"
Si la evaluación es perezosa, la variable
se calculará solo si elegimos ir a la primera (y then
) rama de if
, de lo contrario no lo hará. En la etapa de evaluación (cuando preparamos argumentos para print
), se puede usar el esquema de cortocircuito para decidir si necesitamos llamar a evenSlowerFnc
.
Entonces, en su ejemplo, es una evaluación de cortocircuito, ya que no se produce ningún retraso en el cálculo.