규칙 작성자들이 age>=18=>allow처럼 공백도 괄호도 없이 쓰고 싶어 해요. 보기엔 작은 변화예요. 그런데 여기서 무엇이 토큰인지는 어느 단계에서 정하나요?
Racket에서는 리더가 처음 구문 표현을 만들어요. 평범하게 읽으면 이 조각은 작성자가 생각한 연산자 나열이 아니라 심볼 하나로 들어올 수 있어요. 매크로가 일부러 그 심볼의 철자를 쪼개 볼 수도 있지만, 그러면 표기 안에 작은 파서를 하나 둔 셈이고, 매크로 바깥의 어휘 규칙을 바꾸지는 못해요. 언어에 정말로 다른 토큰 경계나 구분자 규칙이 필요할 때 커스텀 리더가 맞는 도구예요.
확장은 하는 일이 달라요. 잘못된 규칙 형태를 거부하고, 바인딩을 세우고, 규칙을 호출로 바꿀 수 있어요. 나이 값을 얻고, 값이 없을 때 어떻게 할지 정하고, 허용된 동작을 실행하는 건 여전히 런타임 몫이에요. 나중에 attempt 형태가 생기면 확장 단계에서 재시도 엔진 호출을 배치할 수 있어요. 그 엔진이 검사를 반복하는지, 동작을 반복하는지, 둘 다인지는 런타임이 지킬 약속이고 표기에서 밝혀 둬야 해요.
이 선택들이 잘 맞물린다면 이름 붙은 언어로 리더와 확장기의 진입점을 묶을 수 있지만, 그 대가로 문서와 도구 작업이 따라와요. 기존 비교를 호출하고 결정을 돌려주는 게 요청의 전부라면 평범한 라이브러리 호출로도 이미 충분히 분명할 수 있어요. 표기는 멋져도 처음 읽는 사람이 길을 잃으면 비용이 커요.