formatter — 포맷 문자열을 미리 컴파일해 두는 매크로

formatter — 포맷 문자열을 미리 컴파일해 두는 매크로

format을 볼 때마다 똑같은 포맷 문자열을 넘긴다면, 그 문자열을 매번 파싱하는 비용이 아깝게 느껴질 때가 있어요. formatter는 포맷 문자열을 컴파일해서 재사용 가능한 함수로 만들어주는 매크로예요.

출처: CLHS 공식 문서 - 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