Macro System

매크로 선택과 코드 생성 흐름

매크로는 런타임 함수를 호출하는 장치가 아니라 컴파일 전에 토큰을 받아 새 코드를 만들어 넣는 장치다. 언제 함수로 충분하고 언제 매크로가 필요한지 먼저 가른다.

컴파일 전 코드 생성 파이프라인

pipeline
01

호출 토큰

vec![1, 2], derive, 속성, 함수형 호출이 입력이 된다.

02

패턴 또는 파싱

macro_rules!는 패턴 매칭, 절차적 매크로는 TokenStream 분석을 쓴다.

03

코드 생성

반복, 구현 블록, 속성 처리, 새 표현식이 결과 토큰으로 만들어진다.

04

일반 컴파일

확장된 코드는 이후 타입 검사와 빌드 과정을 일반 코드처럼 통과해야 한다.

선택 기준 매트릭스

decision matrix
도구
잘 맞는 문제
입력 단위
주의점
함수
정해진 타입의 값을 받아 계산한다.
매개변수와 반환 타입
트레이트 구현 생성이나 문법 확장은 못 한다.
macro_rules!
반복되는 문법 패턴을 간단히 확장한다.
패턴에 매칭되는 토큰
정의와 호출 스코프를 명확히 관리해야 한다.
절차적 매크로
타입 정보를 바탕으로 구현 코드를 생성한다.
TokenStream
별도 크레이트와 파싱 로직이 필요해 복잡도가 크다.

절차적 매크로 패밀리

family board

커스텀 파생

#[derive(HelloMacro)]처럼 타입에 구현을 자동으로 붙인다.

대상: 구조체와 열거형

속성형

#[route(GET, "/")]처럼 아이템에 새 의미를 덧입힌다.

대상: 함수 등 다양한 아이템

함수형

sql!(SELECT *)처럼 함수 호출 모양으로 토큰을 처리한다.

대상: 호출 괄호 안 토큰