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, (-) 같은 종결자 사이에만 나타나요. case나 cond에서 보이고, 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