WhatAmIDoing es higher-order function porque es una función que devuelve otra función.
Lo que se devuelve es un thunk — un cierre creado para el cómputo retrasado del valor real. Por lo general, los thunk se crean para evaluar perezosamente una expresión (y posiblemente memorizarla), pero en otros casos, simplemente se necesita una función en lugar de un valor simple, como en el caso de "constantly 5
", que en algunos idiomas devuelve una función que siempre devuelve 5.
Esto último podría aplicarse en el ejemplo dado, ya que suponiendo que el lenguaje evalúa en orden de aplicación (es decir, evalúa argumentos antes de llamar a una función), la función no tiene otro objetivo que convertir los valores en una función eso los devuelve.
WhatAmIDoing es realmente una implementación de la función "constantemente" que estaba describiendo. Pero, en general, no tiene que devolver solo args
en la función interna. Se podría volver "ackermann(args)
", lo que podría llevar mucho tiempo, como en ...
function WhatAmIDoing2(args...)
return function()
return ackermann(args)
end
end
Pero WhatAmIDoing2 podría volver inmediatamente porque la evaluación de la función de Ackermann sería suspendido en un closure. (Sí, incluso en un lenguaje de call-by-value.)
No creo que lo llamaría un patrón, más que si las declaraciones son un patrón. Un patrón generalmente resuelve un problema específico. Esta es solo una construcción de lenguaje bastante fundamental. Solo tiene una función de orden superior que devuelve un cierre. – jalf
¿Cuál es el contexto? ¿Y de qué cantidad de este código estamos hablando? ¿Es solo que la función interna puede acceder a las variables definidas en el exterior? Eso es solo un cierre. ¿O es que eres capaz de devolver funciones anidadas? Eso es solo una propiedad de las funciones de orden superior. – jalf