Elixir에서 함수는 일급 시민으로 취급돼요. 즉,
익명 함수는 이름 있는 함수와 달리 정적으로 참조할 수 있는 대상이 없어요. 변수에 할당하거나 즉시 호출할 때만 사용할 수 있죠.
익명 함수는 다음과 같은 경우에 사용할 수 있어요.
익명 함수는 예약어 fn으로 시작하고, 인자는 -> 토큰으로 함수 본문과 구분하며, end로 끝나요. 이름 있는 함수와 마찬가지로 함수의 마지막 표현식은 호출한 함수에 _암묵적으로 반환_돼요.
함수 참조를 호출하려면 참조 변수와 인자 목록 사이에 .을 써야 해요.
function_variable = fn param ->
param + 1
end
function_variable.(1)
# => 2
짧은 축약 표기법을 사용하면 이걸 더 간결하게 만들 수도 있어요.
variable = &(&1 + 1)
variable.(1)
# => 2
Elixir는 _Bitwise 모듈_에 있는 비트를 다루는 여러 함수를 지원해요.
band/2: 비트 ANDbsl/2: 비트 왼쪽 시프트bsr/2: 비트 오른쪽 시프트bxor/2: 비트 XORbor/2: 비트 ORbnot/1: 비트 NOT다음은 비트 연산 함수를 사용하는 예예요.
Bitwise.bsl(1, 3)
# => 8
모든 비트 연산 함수는 정수에서만 동작해요.
Elixir 1.9 이하 버전을 사용한다면, Bitwise 모듈을 사용하기 위해 모듈 정의 시작 부분에서 require Bitwise를 호출해야 해요.
이 연습 문제에서는 데이터에 변환을 수행하는 방식으로 동작하는 암호화 장치의 소프트웨어를 작성하는 임무를 맡았어요. 더 단순한 함수들을 서로 조합해서 복잡한 함수를 유연하게 만들 수 있는 방법이 필요해요.
각 작업마다, 호출하는 스코프에서 호출할 수 있는 익명 함수를 반환해야 해요.
모든 함수는 정수 인자를 받는다고 가정해요. 정수는 Elixir에서 비트 연산을 수행하기에도 적합해요.
Secrets.secret_add/1을 구현해요. 인자 하나를 받고, 그 인자에 secret_add에 전달한 인자를 더하는 함수를 반환해야 해요.
adder = Secrets.secret_add(3)
adder.(2)
# => 5
Secrets.secret_subtract/1을 구현해요. 인자 하나를 받고, 그 인자에서 secret_subtract에 전달한 비밀 값을 빼는 함수를 반환해야 해요.
subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1
Secrets.secret_multiply/1을 구현해요. 인자 하나를 받고, 그 인자에 secret_multiply에 전달한 비밀 값을 곱하는 함수를 반환해야 해요.
multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21
Secrets.secret_divide/1을 구현해요. 인자 하나를 받고, 그 인자를 secret_divide에 전달한 비밀 값으로 나누는 함수를 반환해야 해요.
divider = Secrets.secret_divide(3)
divider.(32)
# => 10
결과가 다른 함수들이 기대하는 입력과 호환되도록 정수 나눗셈을 사용해요.
Secrets.secret_and/1을 구현해요. 인자 하나를 받고, 그 인자와 secret_and에 전달한 비밀 값에 비트 and 연산을 수행하는 함수를 반환해야 해요.
ander = Secrets.secret_and(1)
ander.(2)
# => 0
Secrets.secret_xor/1을 구현해요. 인자 하나를 받고, 그 인자와 secret_xor에 전달한 비밀 값에 비트 xor 연산을 수행하는 함수를 반환해야 해요.
xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2
Secrets.secret_combine/2를 구현해요. 인자 하나를 받고, 그 인자에 secret_combine에 전달한 두 함수를 순서대로 적용하는 함수를 반환해야 해요.
add_one = Secrets.secret_add(1)
multiply_by_2 = Secrets.secret_multiply(2)
combined = Secrets.secret_combine(add_one, multiply_by_2)
combined.(3)
# => 8
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.