데이터를 변경하는 것을 수행하는 함수는 엘릭서의 핵심이 된다

익명 함수

함수형 언어인 만큼 함수가 기본 타입이 되고, fn 키워드로 함수를 만들 수 있다.

sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 2))

위와 같이 사용하면 마지막 값인 a + b를 반환하는 함수가 만들어진다.

호출은 온점(.)을 사용해서 함수를 호출하는 것을 볼 수 있다. (익명 함수이기에) 익명 함수의 경우 인자를 받지 않더라도 괄호를 사용해야 한다.

함수를 선언할 때 인자를 꼭 ()로 묶을 필요가 없다

함수의 인자에서도 패턴 매칭을 활용해서 코드를 작성하는 것이 엘릭서 스러운 것이다 다음은 패턴 매칭을 활용해서 분기(Cond)처럼 사용할 수 있는 코드이다

handle_open = fn
	{:ok, file} -> "Read data: #{IO.read(file, :line)}"
	{_, error} -> "Error: #{:file.format_error(error)}"
end

따라서 위에서 부터 패턴 매칭을 시도하는데 입력이 {:ok, file}의 형태(file은 변수)로 들어오면 위에 Read data 문자열이 반환되고, 그 외의 입력 {_, error}의 형태라면 아래의 Error 문자열이 반환된다 (만약 2-튜플의 형태가 아니라 모든 패턴 매칭에 실패하면 FunctionClauseError 예외 발생)

2중 함수로 함수를 리턴하는 함수를 만들 수 있다

클로저로 스코프가 변수 바인딩되어 저장할 수 있다

greeter = fn name -> (fn -> "Hello #{name}" end) end
dave_greeter = greeter.("Dave")
dave_greeter.() # "Hello Dave"

여기서 내부 함수 name이 “Dave”를 저장하고 있는 것

함수의 인자로 함수를 전달할 수도 있다 다음과 같은 예제를 보고 이해할 수 있다

times_2 = fn n -> n * 2 end
apply = fn (fun, value) -> fun.(value) end
IO.puts(apply.(times_2, 6))