Estaba estudiando el libro Estructura e interpretación de programas informáticos y en la sección 1.1.5 Modelo de sustitución para la aplicación de procedimientos, el autor explica los conceptos de orden normal y orden de aplicación , que creo que he entendido bien.
Ahora, estoy tomando un curso sobre Coursera llamado Principios de programación de funciones en Scala y allí el profesor Martin Odersky (quien basó gran parte de su curso en el libro citado anteriormente) explica los mismos conceptos bajo los nombres de llamada por nombre y llamada- por valor .
En su curso, el profesor Odersky dice que el modelo de sustitución se basa en el cálculo de Lambda, por lo que consulté un libro en mi biblioteca Una introducción a la programación funcional Aunque el cálculo de Lambda y en la página 22, el autor define los términos como orden aplicativo y orden normal . Curiosamente, en su definición, dice que el orden aplicativo es como la llamada por valor de Pascal, mientras que el orden normal es como la llamada por nombre de Algol.
El uso de las palabras "es como" en su explicación es lo que me hizo dudar. Así mis preguntas:
- ¿Son equivalentes estos dos términos o hay diferencias sutiles?
- ¿Puedo usar uno u otro indistintamente sin arriesgarme a cometer un error en el significado que transmiten?
- ¿Hay alguna razón que conozca que justifique la existencia de una terminología diferente para referirse a la misma cosa?
Respuestas:
La evaluación de orden normal y la evaluación de llamada por nombre no son exactamente lo mismo. En la evaluación de orden normal, la función más externa se evalúa antes que cualquiera de sus argumentos, y esos argumentos se evalúan solo si es necesario. En la evaluación llamada por nombre, los argumentos se copian efectivamente en el cuerpo de la función más externa y luego se evalúa esa función. En ambos casos, la función más externa se evalúa técnicamente antes de los argumentos, pero en una llamada pura por nombre, los argumentos se evalúan cada vez que se usan (ya sea cero, una o muchas veces). En orden normal, los argumentos de la función se evalúan al menos solo cuando se necesitan por primera vez (generalmente cero o una vez).
Por lo tanto, la evaluación del orden normal deja abierta la posibilidad de memorizar los argumentos como una optimización (a veces llamada llamada por necesidad), mientras que la llamada por nombre no. Por lo tanto, se podría decir que la evaluación llamada por nombre es un caso especial de evaluación de orden normal. En otras palabras, la evaluación de orden normal se refiere al enfoque general de evaluar una función antes de sus argumentos, mientras que la evaluación de llamada por nombre se refiere a una técnica específica para implementar la evaluación de orden normal.
Como ejemplo, dado
f(x, y) = sqrt(x*x + y*y)
que podríamos tener dos formas de implementarf(a+b, c+d)
con una evaluación de orden normal:Memoized:
Llamada por nombre:
Como puede ver, si la llamada a f incluye otras llamadas a funciones (es decir
f(random(1,100), ask_user_for_value())
), las dos tendrán un comportamiento muy diferente. La versión memorizada cuadrará un solo número aleatorio y le pedirá al usuario un valor solo una vez, mientras que la versión de llamada por nombre multiplicará dos números aleatorios y le pedirá al usuario un valor dos veces.Para obtener más información sobre estos conceptos, recomiendo leer la página de Wikipedia sobre estrategia de evaluación y /cs/7702/applicative-order-and-normal-order-in-lambda-calculus .
fuente