Le funzioni anonime si usano comunemente in tutto Elixir da sole, come valori restituiti e come argomenti in funzioni di ordine superiore come Enum.map/2:
Enum.map([1, 2, 3], fn n -> n + 1 end)
# => [2, 3, 4]
In Elixir, le funzioni sono trattate come cittadini di prima classe:
Le funzioni anonime si creano con la parola chiave fn e si chiamano con un punto (.):
function_variable = fn n -> n + 1 end
function_variable.(1)
# => 2
Le funzioni anonime possono essere create anche con la sintassi abbreviata di cattura &.
Il & iniziale dichiara l'inizio dell'espressione di cattura.
&1, &2 e così via si riferiscono agli argomenti posizionali della funzione anonima.
# Instead of:
fn x, y -> abs(x) + abs(y) end
# We can write:
&(abs(&1) + abs(&2))
L'operatore di cattura & può essere usato anche per catturare una funzione con nome esistente:
# Instead of:
fn a, b -> a <= b end
# We can capture the function using its name and arity:
&<=/2
Le funzioni anonime in Elixir sono closure. Possono accedere alle variabili che sono nello scope nel momento in cui la funzione viene definita. Le variabili assegnate all'interno di una funzione anonima non sono accessibili dall'esterno:
y = 2
square = fn ->
x = 3
x * y
end
square.()
# => 6
x
# => ** (CompileError): undefined function x/0