formatter — 포맷 문자열을 미리 컴파일해 두는 매크로
formatter — 포맷 문자열을 미리 컴파일해 두는 매크로
format을 볼 때마다 똑같은 포맷 문자열을 넘긴다면, 그 문자열을 매번 파싱하는 비용이 아깝게 느껴질 때가 있어요. formatter는 포맷 문자열을 컴파일해서 재사용 가능한 함수로 만들어주는 매크로예요.
본문
formatter는 포맷 문자열을 받아 함수 하나를 돌려줘요. 이 함수는 control-string을 영원히 파싱해 쓰지 않고, 미리 컴파일된 형태로 다음 format 동작과 같은 일을 해요.
formatter control-string => function
돌려받는 함수는 개념상 다음과 같은 동작을 해요.
#'(lambda (*standard-output* &rest arguments)
(apply #'format t control-string arguments)
arguments-tail)
format은 포맷 문자열을 매번 해석해야 하지만, formatter로 만들어 둔 함수는 그 해석을 미리 끝내 둔다는 점이 핵심이에요. control-string은 평가되지 않는 포맷 문자열이에요.
(funcall (formatter "~&~A~A") *standard-output* 'a 'b 'c)
>> AB
=> (C)
여기서 인자 'a와 'b가 ~A 두 개에 소모되고, 남은 'c가 반환값으로 돌아와요. 일반적인 출력이 필요하면 format에 바로 넘겨 쓸 수도 있어요.
(format t (formatter "~&~A~A") 'a 'b 'c)
>> AB
=> NIL
예외 상황
인자가 유효한 포맷 문자열이 아니면 매크로 확장 시점이나 실행 시점에 오류가 신호될 수 있어요.
함께 보기
format