Funciones
Como lenguaje funcional, Botlang admite funciones de orden superior. O sea, las funciones pueden recibir funciones como entrada, y retornar funciones.
Definición de función¶
Una función recibe n argumentos, donde n es un número natural, y entrega un valor.
Tanto los argumentos como el valor de retorno pueden ser de cualquier tipo admitido por el lenguaje, incluyendo string, number, list, dict, y funciones.
Una descripción de función es de la forma (function (arg1 ... argn) body)
.
Por ejemplo,
1 | (function (n) (+ n 1)) ; suma 1 a n y retorna ese valor |
También se puede usar la forma abreviada fun
:
1 | (fun (n) (+ n 1)) |
Aplicación de función¶
El primer elemento de una s-expression indica el comportamiento de dicha expresión. Existen identificadores reservados (define, por ejemplo) que tienen comportamiento específico.
Todo el resto se considerará como una aplicación de función de la forma (id-funcion arg1 ... argn)
.
Por ejemplo,
1 2 | (+ 1 2) >> 3 |
En este caso se aplica la función suma con los argumentos 1 y 2, lo cual retorna un 3. Pero también se puede aplicar una función descrita inline:
1 2 | (fun (n) (+ n 2)) 1) >> 3 |
En este ejemplo se aplica el argumento 1 sobre una función que suma 2 a n, retornando 3.
Orden de aplicación¶
Al momento de aplicar una función, primero se evalúan los argumentos de izquierda a derecha, y finalmente se evalúa el cuerpo de la función haciendo uso de los valores calculados para los argumentos.
Scope¶
Botlang es un lenguaje con ámbito léxico. Esto significa que los identificadores usados en el cuerpo de la función quedan asociados al valor que tienen al momento de la definición, formando una clausura.
Esto implica que el retorno de una función sólo depende de los argumentos que reciba y el cuerpo que tenga definido. O sea, no depende del contexto en el cual se invoque.
Funciones de orden superior¶
Las funciones pueden recibir funciones como argumento, y retornar funciones.
1 2 3 4 5 6 7 8 9 10 11 | [define f (fun (g n) [fun (x) (g (+ x n))] ) ] [define g (f [fun (n) (* n n)] 2) ] [define h (g 3)] h >> 25 |
Recursión¶
El lenguaje soporta recursión. De hecho, es el único mecanismo de iteración además de las primitivas que operan sobre listas (map, reduce, etc).
1 2 3 4 5 6 7 8 9 10 | (define factorial (fun (n) (if (equal? n 0) 1 (* n (factorial (- n 1))) ) ) ) (factorial 5) >> 120 |