First class functions

Se dice que un lenguaje de programación tiene funciones de primera clase cuando las funciones en ese lenguaje se tratan como cualquier otra variable.

Por ejemplo, en un lenguaje de este tipo, una función puede ser

Cuatro propiedades importantes:

Functions are objects

Hemos pasado una función a otra. Es posible, por ende, pasar funciones como argumentos y devolver funciones como resultado de una función.

Function objects and their names are two separate concerns.

Dado que la función g apunta a la underlying function, lo podemos utilizar.

Hemos borrado el pointer square...no el pointer g

Las funciones se pueden guardar en estructuras de datos

Se podría llamar a la función directamente del data structure

Las funciones pueden pasarse a otras funciones

Vamos a poner como parametro la funcion que nos interesa

Ejemplo:

La función map: toma una función y un array como argumentos y ejecuta cada valor de ese array a través de la función proporcionada y devuelve un nuevo array con esos resultados

Idea: podemos pasar cualquier funcion como argumento

Functions can be nested

Suave no existe más que en la función hablar

Que pasaria si queremos acceder a la funcion suave desde fuera de hablar

Importante: mirar que ahora no ejecuto la función

Podemos complicar aun mas: las funciones puede captar el local state

no solo las funciones pueden retornar otras funciones, estas innner functions tambien pueden capturar y llevar estados de las funciones padres. Veamos como

Introduction to closures: local function

Python nos permite definir nuestras funciones en un ámbito local, es decir, dentro de una función

Las funciones locales están sujetas a las mismas reglas de ámbito que otras funciones, esto nos lleva a la regla LEGB para la búsqueda de nombres en python - la comprobación comienza con el ámbito local, luego el ámbito envolvente, luego el ámbito global y finalmente el ámbito incorporado LEGB - Local, Envolvente, Global, Integrado

Las funciones locales que hemos visto hasta ahora no tienen una forma definida de interactuar con el ámbito que las rodea.

Esto es, mueren una vez que se ejectuan.

Modifiquemos la función inner para que pueda seguire viva una vez que termina de ejecutarse la funcion outer

La función inner_func hace referencia a la función outer_func para obtener el valor de x.

La función local puede hacer referencia al ámbito externo mediante closures o cierres. Los closures mantienen referencias a objetos del ámbito anterior.

Closure is commonly used in what is referred to as Function Factory - these are functions that return other functions.

The returned functions are specialized.

The Function Factory takes in argument(s), creates local function that creates its own argument(s) and also uses the argument(s) passed to the function factory.

This is possible with closures

Vamos a cambiar la función anterior

Closures

closure es un record, un registro que almacena una función junto a su entorno, the enviromment.

The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.


Unlike a plain function, a closure allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope.

Squemos el parentesis de la función inner

We return a function: hence, out makes reference to a function

A closure is an inner functions that remembers and have access to variables in the local scope it was created (even after the outer function has finish executing)
Lets add parameters to the functions within a scope

-Cuando el programa define la función, predefine las variables dentro de outer_f, i.e., las inicializa pero no las evalua

-message
-edad
-inner

Cuando llamo a outer_f lo que hace es