Les fonctions anonymes sont couramment utilisées dans tout Elixir, seules, comme valeurs de retour ou comme arguments de fonctions d'ordre supérieur telles que Enum.map/2 :
Enum.map([1, 2, 3], fn n -> n + 1 end)
# => [2, 3, 4]
En Elixir, les fonctions sont des citoyens de première classe :
Les fonctions anonymes se créent avec le mot-clé fn et s'invoquent avec un point (.) :
function_variable = fn n -> n + 1 end
function_variable.(1)
# => 2
Les fonctions anonymes peuvent aussi se créer avec la forme abrégée de capture &.
Le & initial marque le début de l'expression de capture.
&1, &2, etc. font référence aux arguments positionnels de la fonction anonyme.
# Instead of:
fn x, y -> abs(x) + abs(y) end
# We can write:
&(abs(&1) + abs(&2))
L'opérateur de capture & peut aussi servir à capturer une fonction nommée existante :
# Instead of:
fn a, b -> a <= b end
# We can capture the function using its name and arity:
&<=/2
Les fonctions anonymes en Elixir sont des fermetures. Elles peuvent accéder aux variables qui sont dans la portée au moment où la fonction est définie. Les variables affectées à l'intérieur d'une fonction anonyme ne sont pas accessibles en dehors de celle-ci :
y = 2
square = fn ->
x = 3
x * y
end
square.()
# => 6
x
# => ** (CompileError): undefined function x/0