익명 함수는 Elixir 전반에서 단독으로, 반환값으로, 또 Enum.map/2 같은 고차 함수의 인자로 흔히 사용해요:
Enum.map([1, 2, 3], fn n -> n + 1 end)
# => [2, 3, 4]
Elixir에서 함수는 일급 객체로 취급해요:
익명 함수는 fn 키워드로 만들고, 점(.)을 붙여 호출해요:
function_variable = fn n -> n + 1 end
function_variable.(1)
# => 2
익명 함수는 & 캡처 축약형으로도 만들 수 있어요.
맨 앞의 &는 캡처 표현식의 시작을 알려요.
&1, &2 등은 익명 함수의 위치 인자를 가리켜요.
# Instead of:
fn x, y -> abs(x) + abs(y) end
# We can write:
&(abs(&1) + abs(&2))
& 캡처 연산자는 이미 있는 이름 있는 함수를 캡처하는 데에도 쓸 수 있어요:
# Instead of:
fn a, b -> a <= b end
# We can capture the function using its name and arity:
&<=/2
Elixir의 익명 함수는 클로저예요. 함수가 정의될 때 스코프 안에 있는 변수에 접근할 수 있어요. 익명 함수 안에서 할당한 변수는 그 밖에서는 접근할 수 없어요:
y = 2
square = fn ->
x = 3
x * y
end
square.()
# => 6
x
# => ** (CompileError): undefined function x/0