이 장에서 살펴볼 내용은 세가지다


1.익명함수

2.함수에서의 패턴매칭

3.파이프연산자


---


1.익명함수

엘릭서는 fn키워드로 익명함수를 만들 수 있다


fn

parameter-list -> body

parameter-list -> body ...

end


fn...end를 문자열을 감싸는 따옴표같은것이라고 여기되

문자열대신 함수를 반환하는 문법이라고 생각하면 된다

이렇게 만든 함수는 다른함수에 전달하거나 인자를넣어 호출할 수 있다


> sum = fn (a, b) -> a + b end

> sum.(1, 2)

3


익명함수는 온점을 사용해 함수를 호출하고 괄호안에 인자를 넣어 전달할 수 있다

또한 익명함수에서는 함수가 인자를 받지않더라도 괄호를 사용해 호출해야한다

기명함수는 온점을 사용하지 않고 괄호를 생략할 수 있다


---


2.함수에서의 패턴매칭

sum.(2,3)을 호출하면 2를 a에 할당하고 3을 b에 할당한다는것을 예상할 수 있지만

엘릭서에는 할당문이 없고 문법규칙을 통해 값을 패턴에 매칭하려고 한다


튜플의 두 값을 바꾸는 함수를 작성한다면

> swap = fn {a, b} -> {b, a} end

> swap.({6, 8})

{8, 6}

이렇게 사용할 수 있다


동일한 함수는 항상 파라미터의 개수는 같아야 하고 

인자의 타입과 내용에 따라 여러 구현을 정의할 수 있는데

어떤 구현을 실행할지는 기본적으로 패턴매칭을 통해 결정된다


예를들어

파일을 열었을때 성공 여부에 따라 다른 일을 하는 함수를 작성한다고 하면


> handle_open = fn

{:ok, file} -> "Read data: #{IO.read(file, :line)}"

{_, error} -> "Error: #{:file.format_error(error)}

end

> handle_open.(File.open("code/intro/hello.exs")) # 존재하는 파일인 경우

"Read data: IO.puts \"Hello, World!\""

> handle_open.(File.open("nonexist")) # 존재하지않는 파일인 경우

"Error: no such file or directory"


이렇게 작성할 수 있다


---

3.파이프연산자

함수들을 여러개 연결해서 실행할 수 있다

>"Elixir rocks" |> String.upcase() |> String.split()

>["ELIXIR", "ROCKS"]