비밀

비밀

학습 연습 문제

소개

익명 함수

Elixir에서 함수는 일급 시민으로 취급돼요. 즉,

  • 이름 있는 함수와 익명 함수를 변수에 할당할 수 있어요.
  • 이름 있는 함수와 익명 함수를 데이터처럼 인자와 반환값으로 주고받을 수 있어요.
  • 익명 함수를 동적으로 만들 수 있어요.

익명 함수는 이름 있는 함수와 달리 정적으로 참조할 수 있는 대상이 없어요. 변수에 할당하거나 즉시 호출할 때만 사용할 수 있죠.

익명 함수는 다음과 같은 경우에 사용할 수 있어요.

  • 렉시컬 스코프(클로저라고도 해요)를 이용해 데이터를 숨길 때
  • 실행 중에 함수를 동적으로 만들 때

익명 함수는 예약어 fn으로 시작하고, 인자는 -> 토큰으로 함수 본문과 구분하며, end로 끝나요. 이름 있는 함수와 마찬가지로 함수의 마지막 표현식은 호출한 함수에 _암묵적으로 반환_돼요.

함수 참조를 호출하려면 참조 변수와 인자 목록 사이에 .을 써야 해요.

function_variable = fn param ->
  param + 1
end

function_variable.(1)
# => 2

짧은 축약 표기법을 사용하면 이걸 더 간결하게 만들 수도 있어요.

variable = &(&1 + 1)

variable.(1)
# => 2

비트 조작

Elixir는 _Bitwise 모듈_에 있는 비트를 다루는 여러 함수를 지원해요.

  • band/2: 비트 AND
  • bsl/2: 비트 왼쪽 시프트
  • bsr/2: 비트 오른쪽 시프트
  • bxor/2: 비트 XOR
  • bor/2: 비트 OR
  • bnot/1: 비트 NOT

다음은 비트 연산 함수를 사용하는 예예요.

Bitwise.bsl(1, 3)
# => 8

모든 비트 연산 함수는 정수에서만 동작해요.

Elixir 1.9 이하 버전을 사용한다면, Bitwise 모듈을 사용하기 위해 모듈 정의 시작 부분에서 require Bitwise를 호출해야 해요.

지침

이 연습 문제에서는 데이터에 변환을 수행하는 방식으로 동작하는 암호화 장치의 소프트웨어를 작성하는 임무를 맡았어요. 더 단순한 함수들을 서로 조합해서 복잡한 함수를 유연하게 만들 수 있는 방법이 필요해요.

각 작업마다, 호출하는 스코프에서 호출할 수 있는 익명 함수를 반환해야 해요.

모든 함수는 정수 인자를 받는다고 가정해요. 정수는 Elixir에서 비트 연산을 수행하기에도 적합해요.

1. 덧셈 함수 만들기

Secrets.secret_add/1을 구현해요. 인자 하나를 받고, 그 인자에 secret_add에 전달한 인자를 더하는 함수를 반환해야 해요.

adder = Secrets.secret_add(3)
adder.(2)
# => 5

2. 뺄셈 함수 만들기

Secrets.secret_subtract/1을 구현해요. 인자 하나를 받고, 그 인자에서 secret_subtract에 전달한 비밀 값을 빼는 함수를 반환해야 해요.

subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1

3. 곱셈 함수 만들기

Secrets.secret_multiply/1을 구현해요. 인자 하나를 받고, 그 인자에 secret_multiply에 전달한 비밀 값을 곱하는 함수를 반환해야 해요.

multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21

4. 나눗셈 함수 만들기

Secrets.secret_divide/1을 구현해요. 인자 하나를 받고, 그 인자를 secret_divide에 전달한 비밀 값으로 나누는 함수를 반환해야 해요.

divider = Secrets.secret_divide(3)
divider.(32)
# => 10

결과가 다른 함수들이 기대하는 입력과 호환되도록 정수 나눗셈을 사용해요.

5. "and" 함수 만들기

Secrets.secret_and/1을 구현해요. 인자 하나를 받고, 그 인자와 secret_and에 전달한 비밀 값에 비트 and 연산을 수행하는 함수를 반환해야 해요.

ander = Secrets.secret_and(1)
ander.(2)
# => 0

6. "xor" 함수 만들기

Secrets.secret_xor/1을 구현해요. 인자 하나를 받고, 그 인자와 secret_xor에 전달한 비밀 값에 비트 xor 연산을 수행하는 함수를 반환해야 해요.

xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2

7. 함수 조합기 만들기

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
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Elixir Exercism

비밀 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.