Tasks y lambdas
Una task es una función: parámetros, un cuerpo y give para devolver un valor.
-- Doc example: tasks, default args, named args, recursion, lambdas.
intent: "doc example: tasks and lambdas"
task add(a, b)
give a + b
task greet(name, greeting = "Hello")
give greeting + ", " + name + "!"
task factorial(n)
when n <= 1
give 1
otherwise
give n * factorial(n - 1)
print(greet("Ada") + " factorial(5) = " + text(factorial(5))) -- run shows the result
test "call, default arg, named arg"
assert_eq(add(2, 3), 5)
assert_eq(greet("Ada"), "Hello, Ada!")
assert_eq(greet("Ada", "Hi"), "Hi, Ada!")
assert_eq(greet("Ada", greeting = "Hey"), "Hey, Ada!")
test "recursion"
assert_eq(factorial(5), 120)
test "lambdas are values, passed to higher-order tasks"
let triple be (n) => n * 3
assert_eq(triple(4), 12)
assert_eq(apply(triple, [1, 2, 3]), [3, 6, 9])
Argumentos por defecto y con nombre
task greet(name, greeting = "Hello")
give greeting + ", " + name + "!"
greet("Ada") -- usa el default
greet("Ada", "Hi") -- posicional
greet("Ada", greeting = "Hey") -- con nombre (en cualquier orden)
El valor por defecto (= expr) se evalúa al llamar. Ojo: = acá es la forma de argumento — la asignación general es let/set, y la igualdad es ==.
Recursión
Una task puede llamarse a sí misma (factorial arriba). No hay keyword especial — solo give.
Lambdas
Una lambda es un valor: (params) => expr. Guardala, pasala, o dásela a una operación de orden superior:
let triple be (n) => n * 3
apply(triple, [1, 2, 3]) -- [3, 6, 9]
where(items, (x) => x.active) -- predicado inline