Nim은 매크로를 쓰기 쉽게 해 준다. 그게 문제다.
macro에 손대기 전에 더 싼 도구부터 본다. const는 매크로를 돌리는 바로 그 VM이 컴파일 시점에 평가한다. 그래서 평범한 proc으로 만든 조회 테이블은 그냥 const table = buildTable()이다. static: 블록은 컴파일 중에 코드를 돌리고 아무것도 생성하지 않는다. 설정 검사, 크기, 문자열 형식. 평범한 proc을 일찍 부를 뿐이다.
그다음은 템플릿. 단순 치환이고 AST를 돌아다니지 않는다. 작은 DSL을 원하는 경우는 대개 여기서 끝난다.
진짜 매크로가 필요한 건 앞의 셋으로 표현이 안 되는 문법뿐이다. 그때도 매크로는 노드 배치만 바꾼다. NimNode가 필요 없는 로직은 평범한 proc에 두고, 그건 다른 코드처럼 런타임에 테스트한다.
매크로는 작게, proc은 크게. 오류 메시지가 읽힌다.