추상 구문 트리(Abstract Syntax Tree, AST)는 코드를 데이터로 표현하는 방법이에요. 인용 표현이라고도 하죠.
AST의 각 노드는 세 개의 원소로 이루어진 튜플이에요.
# AST representation of:
# 2 + 3
{:+, [], [2, 3]}
첫 번째 원소인 아톰은 연산을 나타내요. 두 번째 원소인 키워드 리스트는 메타데이터고요. 세 번째 원소는 인자 목록으로, 그 안에 다른 노드들이 들어 있어요. 정수, 아톰, 문자열 같은 리터럴 값은 세 개의 원소로 이루어진 튜플 대신 AST 안에서 자기 자신으로 표현돼요.
Elixir 코드를 AST로, 다시 AST를 코드로 바꾸는 일은 표준 라이브러리에 들어 있어요. AST를 다루는 함수는 Code 모듈(예: 코드가 담긴 문자열을 AST로 바꾸기)과 Macro 모듈(예: AST를 순회하거나 문자열로 바꾸기)에서 찾을 수 있어요.
참고로 표준 라이브러리의 모든 함수는 AST를 가리킬 때 "quoted"라는 이름을 써요 (_인용 표현_을 줄인 말이에요).
코드를 AST로 바꾸는 특수 폼은 quote라고 해요. 코드 블록을 받아서 그 AST를 반환해요.
quote do
2 + 3 - 1
end
# => {:-, [], [
# {:+, [], [2, 3]},
# 1
# ]}
코드를 AST로 표현할 수 있는 능력은 Elixir 메타프로그래밍의 핵심이에요. Elixir 코드를 만들어 내는 Elixir 코드를 작성하는 방법인 _매크로_는 AST를 결과로 반환하는 방식으로 동작해요.
AST의 또 다른 활용 사례는 정적 코드 분석이에요. Exercism의 자체 도구인 Analyzer가 대표적인데, 아마 풀이에 댓글을 남기는 작은 봇으로 이미 익숙할 거예요.