선택 문법
선택 문법 (Optional syntax)
앞 장들에서 Elixir 문법은 코드를 더 읽기 좋게 만들기 위해 몇몇 경우에 구분자(delimiter)를 생략할 수 있게 해 준다고 배웠어요. 이 장에서는 그 생략 규칙, 즉 "선택 문법(optional syntax)"이 정확히 어떤 것들인지 한 번에 정리해 볼게요.
본문
예를 들어 괄호는 생략할 수 있어요:
iex> length([1, 2, 3]) == length [1, 2, 3]
true
그리고 do-end 블록은 키워드 리스트와 동등해요:
# do-end 블록
iex> if true do
...> :this
...> else
...> :that
...> end
:this
# 키워드 리스트
iex> if true, do: :this, else: :that
:this
키워드 리스트는 Elixir의 일반 표기로 인자를 구분해요. 각 키-값 쌍을 쉼표로 나누고, 각 키 뒤에 :를 붙이죠. 반면 do-블록에서는 콜론과 쉼표를 없애고, 각 키워드를 줄바꿈으로 구분해요. do-블록은 코드 블록을 쓸 때 장황함을 없애 준다는 점에서 유용해요. 대부분 블록 문법을 쓰지만, 둘이 동등하다는 사실을 알아 두면 좋아요.
이런 편의 기능을 여기서는 "선택 문법(optional syntax)"이라고 불러요. 이 덕분에 언어의 핵심 문법은 작게 유지하면서도, 코드의 가독성과 표현력은 잃지 않을 수 있어요. 이 짧은 장에서는 언어가 제공하는 네 가지 규칙을 짧은 코드 조각을 가지고 살펴볼게요.
직접 따라 해 보기 (Walk-through)
다음 코드를 봐요:
if variable? do
Call.this()
else
Call.that()
end
이제 편의 기능을 하나씩 제거해 볼게요.
do-end 블록은 키워드와 동등해요:
if variable?, do: Call.this(), else: Call.that()
마지막 인자로 온 키워드 리스트에는 대괄호가 필요 없지만, 일단 대괄호를 추가해 볼게요:
if variable?, [do: Call.this(), else: Call.that()]
키워드 리스트는 두 요소짜리 튜플 리스트와 같아요:
if variable?, [{:do, Call.this()}, {:else, Call.that()}]
마지막으로, 함수 호출의 괄호는 생략 가능하지만, 일단 괄호를 추가해 볼게요:
if(variable?, [{:do, Call.this()}, {:else, Call.that()}])
다 됐어요! 이 네 가지 규칙이 Elixir에서 쓸 수 있는 선택 문법의 전부예요.
이 규칙이 왜 중요한지 이해하려면 Elixir를 다른 프로그래밍 언어와 잠깐 비교해 보면 도움이 돼요. 대부분의 언어는 메서드, 함수, 조건문, 반복문 등을 정의하기 위한 여러 개의 키워드를 가져요. 그리고 그 키워드마다 각자의 문법 규칙이 붙어 있죠.
하지만 Elixir에서는 이런 언어 기능 중 어느 것도 특별한 "키워드"를 요구하지 않아요. 모두 이 작은 규칙 집합 위에서 만들어져요. 또 다른 이점은, 언어를 설계하고 확장하는 구성요소가 같기 때문에 개발자들이 언어와 일관된 방식으로 언어를 확장할 수 있다는 점이에요. 이 주제는 "Meta-programming" 가이드에서 더 깊게 다뤄요.
결국 이 규칙 덕분에 우리는 이런 코드를 쓸 수 있어요:
defmodule Math do
def add(a, b) do
a + b
end
end
이런 코드 대신에 말이죠:
defmodule(Math, [
{:do, def(add(a, b), [{:do, a + b}])}
])
무언가 궁금할 때마다 이 빠른 정리(walk-through)가 답을 알려 줄 거예요.
마지막으로, 이 규칙을 언제 적용해야 할지 걱정된다면, Elixir 포매터가 그 걱정을 처리해 준다는 점을 기억하세요. 대부분의 Elixir 개발자는 Elixir 팀과 커뮤니티가 정의한 잘 정리된 규칙 집합에 따라 코드베이스를 포매팅하기 위해 mix format 태스크를 써요. 예를 들어 mix format은 명시적으로 그렇게 하지 않도록 설정하지 않는 한 항상 함수 호출에 괄호를 추가해요. 이렇게 하면 조직과 더 넓은 커뮤니티 전반에서 일관성을 유지하는 데 도움이 돼요.
더 알아보기
- Syntax reference — Elixir 문법 전체 참조
- Quote and unquote —
do-end블록이 키워드 리스트로 변환되는 메커니즘 mix format— 코드 스타일을 자동으로 맞춰 주는 태스크- Meta-programming 가이드 — 언어를 확장하는 방법