Syntax reference — Elixir 문법 참조

Syntax reference — Elixir 문법 참조

Elixir 문법은 추상 구문 트리(AST)로의 변환이 단순하도록 설계되어 있어요. 그래서 문법 대부분이 일관적이고, 흔한 관용구의 노이즈를 줄이기 위한 아주 적은 수의 "문법 설탕(syntax sugar)"만 존재해요.

출처: Syntax reference

본문

이 문서는 Elixir의 모든 문법 구조를 참조(reference)로 다루고, 각각의 정확한 AST 표현을 설명해요.

예약어(Reserved words)

Elixir 언어의 예약어는 다음과 같아요.

  • true, false, nil — 아톰으로 사용
  • when, and, or, not, in — 연산자로 사용
  • fn — 익명 함수 정의에 사용
  • do, end, catch, rescue, after, else — do-end 블록에 사용

데이터 타입

숫자(Numbers) — 정수(1234)와 실수(123.4)는 숫자 나열로 표현되며 가독성을 위해 밑줄로 구분할 수 있어요(1_000_000). 정수는 절대 점(.)을 포함하지 않아요. 실수는 점과 그 뒤 숫자가 하나 이상 있어요. 실수는 과학적 표기(123.4e10 또는 123.4E10)도 지원해요.

아톰(Atoms) — 따옴표 없는 아톰은 콜론(:)으로 시작하고, 그 뒤에 바로 유니코드 문자나 밑줄이 와야 해요. 계속해서 유니코드 문자, 숫자, 밑줄, @가 올 수 있고 !?로 끝날 수 있어요. 유효한 예: :ok, :ISO8601, :integer?. 콜론 뒤에 큰따옴표·작은따옴표 쌍이 이어지면 인용된(quoted) 아톰이 되는데, 이 경우 문자만 아니라 어떤 유니코드 문자로도 만들 수 있어요(:++olá++, :"123"). 이름이 같으면 인용과 비인용 아톰은 동일하게 취급돼요. Elixir의 모든 연산자도 유효한 아톰이에요. 예: :foo, :foo@bar, :++. 단 :@foo(시작에 @ 금지), :123(시작에 숫자 금지)은 유효하지 않아요. true, false, nil은 각각 :true, :false, :nil 아톰으로 표현되는 예약어예요.

문자열(Strings) — 한 줄 문자열은 큰따옴표로 써요("foo"). 문자열 안의 큰따옴표는 \로 이스케이프돼요. 유니코드를 지원하며 UTF-8 인코딩 바이너리로 저장돼요. 여러 줄 문자열은 히어독(heredoc) 이라고 부르며 큰따옴표 3개로 쓰고, 안에서 따옴표를 이스케이프하지 않아도 돼요. 결과 문자열은 개행으로 끝나요.

iex> test = """
...>     this
...>     is
...>     a
...>     test
...> """
"    this\n    is\n    a\n    test\n"

닫는 """의 들여쓰기로부터 내부 들여쓰기를 제거해요.

차리스트(Charlists) — 차리스트는 각각이 유니코드 코드 포인트를 나타내는 음이 아닌 정수의 리스트예요.

iex> 'abc' === [97, 98, 99]
true

차리스트는 작은따옴표로 써요('foo'). 여러 줄 차리스트는 작은따옴표 3개(''')로 쓰는데, 이 문법은 deprecated이고 ~c 시길을 권장해요.

리스트·튜플·바이너리[...], {...}, <<...>>로 구분해요. 각 원소는 쉼표로 구분하고, 끝에 쉼표도 허용돼요([1, 2, 3,]).

맵과 키워드 리스트 — 맵은 %{...} 표기를 쓰고 각 키-값은 =>로 표시해요(%{"hello" => 1, 2 => "world"}). 키워드 리스트(첫 원소가 아톰인 2-튜플의 리스트)와 아톰 키 맵 모두 콜론을 아톰 끝으로 옮기는 키워드 표기를 지원해요. %{hello: "world"}%{:hello => "world"}와 같고, [foo: :bar][{:foo, :bar}]와 같아요.

구조체(Structs)%{ 사이에 구조체 이름을 넣어 맵 문법 위에 만든다(%User{...}).

표현식(Expressions)

변수(Variables) — 밑줄이나 대문자·타이틀케이스가 아닌 유니코드 문자로 시작해야 해요. 이후엔 유니코드 문자, 숫자, 밑줄을 쓸 수 있고 ?!로 끝날 수 있어요. 명명 규칙은 snake_case 를 권장해요.

비자격 호출/로컬 호출(Non-qualified calls)add(1, 2)처럼 변수와 같은 규칙을 따르며 선택적으로 괄호를 붙여요. 인자 없는 호출(0-arity)은 괄호가 필수예요(변수와의 혼동 방지). 괄호를 쓰면 함수명 뒤에 공백 없이 바로 붙여야 해요. add (1, 2)는 문법 오류예요.

연산자(Operators)=, when, &, @ 같은 구조도 연산자로서 비자격 호출로 취급돼요.

자격 호출/원격 호출(Qualified calls)Math.add(1, 2)처럼 모듈을 거치는 호출이에요. 0-arity 호출에서 괄호의 의미가 달라져요: mod.fun()은 함수 호출, map.field맵의 필드 접근이에요.

앨리어스(Aliases) — 컴파일 타임에 아톰으로 확장되는 구조예요. String:"Elixir.String" 아톰으로 확장돼요. ASCII 대문자로 시작해야 하고, 점으로 여러 개를 이어 쓸 수 있어요(MyApp.String:"Elixir.MyApp.String"). 명명 규칙은 CamelCase 를 권장해요.

모듈 속성(Module attributes) — 단항 연산자 @와 변수·로컬 호출의 조합으로 써요. @foo "value"로 쓰고 @foo로 읽어요.

블록(Blocks) — 여러 Elixir 표현식을 개행이나 세미콜론으로 구분한 것. 괄호로 새 블록을 만들 수 있어요.

좌→우 화살표(->) — 좌우 관계(보통 clause)를 세우는 데 사용돼요. do-end, fn-end, (-) 같은 종결자 사이에만 나타나요. casecond에서 보이고, fn-end 사이에서 익명 함수를 만드는 데도 써요.

case 1 do
  2 -> 3
  4 -> 5
end

fn x, y -> x + y end

시길(Sigils)~로 시작하고 소문자 하나 또는 대문자 여러 개, 그리고 구분자 쌍((), {}, [], <>, "", '', ||, //)이 이어져요. 대문자 시길은 보간을 허용하지 않아요(아래 비교).

~s/f#{ "o" }o/
~S/f#{ "o" }o/

시길은 정규식, 날짜시간처럼 자체 이스케이프 규칙을 가진 텍스트를 인코딩하는 데 유용해요.

Elixir AST

Elixir 문법은 추상 구문 트리(AST)로 단순 변환되도록 설계됐어요. Elixir의 AST는 아톰, 정수, 실수, 문자열, 리스트, 2-튜플, 그리고 아래 설명할 호출·변수를 나타내는 3-튜플로 구성된 평범한 Elixir 데이터 구조예요.

AST의 기본 구성 단위는 호출(call) 이에요. sum(1, 2, 3)은 다음 3-튜플로 표현돼요.

{:sum, meta, [1, 2, 3]}

첫 원소는 아톰(또는 다른 튜플), 둘째는 메타데이터(줄 번호 같은 2-튜플 리스트), 셋째는 인자 리스트예요. quote로 어떤 표현식이든 AST를 얻을 수 있어요.

quote do: sum()
#=> {:sum, [], []}

변수도 3-튜플로 표현되는데 셋째 원소가 변수 컨텍스트를 나타내는 아톰이에요.

quote do: sum
#=> {:sum, [], Elixir}

연산자는 비자격 호출로 취급돼요(1 + 2{:+, [], [1, 2]}). 원격 호출은 점(.)을 연산자로 쓰고 두 인자를 가져요. 익명 함수 호출은 점의 오른쪽에 함수 이름이 없어서 점이 단일 인자를 가져요.

앨리어스는 __aliases__ 호출로, 데이터 구조 중 리스트는 리터럴이라 그대로, 3-튜플은 {:{}, [], [...]}로, 바이너리는 :<<>> 태그로, 맵은 {:%{}, [], [{1, 2}, {3, 4}]}처럼 표현돼요. 블록은 __block__ 호출로 각 줄이 별도 인자예요.

quote do
  Foo.Bar.Baz
end
#=> {:__aliases__, [], [:Foo, :Bar, :Baz]}

더 알아보기

  • 연산자 전체 참조: Operators 페이지
  • 차리스트: List 모듈의 Charlists 섹션
  • Unicode 문법: Unicode syntax 문서
  • 관련 모듈: Code(컴파일), Macro(AST 조작), quote/unquote
  • 관련 예외: SyntaxError, TokenMissingError