WITH-OUTPUT-TO-STRING — 문자열로 쓰는 출력 스트림 매크로
WITH-OUTPUT-TO-STRING — 문자열로 쓰는 출력 스트림 매크로
format 같은 출력을 파일 대신 메모리 속 문자열에 모아두고 싶을 때 쓰는 매크로예요. 문자 출력 스트링 스트림을 만들어, 몸체에 쓴 내용을 문자열로 모아 돌려줘요.
시그니처
with-output-to-string (var &optional string-form &key element-type) declaration* form* => results*
본문
인자와 값 (Arguments and Values)
var— 변수 이름(variable name).string-form— 폼 또는nil;nil이 아니면 평가되어 문자열을 만들어요.string— 채움 포인터(fill pointer)를 가진 문자열.element-type— 타입 지정자; 평가돼요. 기본값은character.declaration—declare식; 평가되지 않아요.forms— 암묵적 progn.results—string-form이 주어지지 않았거나nil이면 문자열이고, 그 외에는forms가 돌려준 값.
설명 (Description)
with-output-to-string은 문자 출력 스트림을 만들고, 이 스트림으로 결과를 보낼 수 있는 일련의 연산을 수행한 뒤 스트림을 닫아요.
element-type은 스트림 요소의 타입을 이름 짓고, 주어진 타입의 요소를 수용할 수 있는 가장 전문화된 타입으로 스트림이 구성돼요.
몸체는 var를 출력 스트링 스트림에 바인딩한 채 암묵적 progn으로 실행돼요. 그 스트링 스트림으로의 모든 출력은 문자열에 저장돼요.
string이 주어지면 element-type은 무시되고, 출력은 vector-push-extend를 쓰는 것처럼 string에 점진적으로 덧붙여져요.
출력 스트림은 정상적으로 나가든 비정상적으로 나가든 with-output-to-string에서 나갈 때 자동으로 닫혀요. var가 바인딩되는 출력 스트링 스트림은 동적 지속 기간(dynamic extent)을 가지며, 그 기간은 폼에서 나가면 끝나요.
string이 주어지지 않으면 with-output-to-string은 문자를 받아 '지정된 element-type의 문자열'을 돌려주는 스트림을 만들어요. string이 주어지면 with-output-to-string은 마지막 form을 평가한 결과를 돌려줘요.
var 변수를 할당(assign)하려고 하면 결과는 정의되지 않아요(undefined).
예제 (Examples)
(setq fstr (make-array '(0) :element-type 'base-char
:fill-pointer 0 :adjustable t)) => ""
(with-output-to-string (s fstr)
(format s "here's some output")
(input-stream-p s)) => false
fstr => "here's some output"
예제에서 fstr에 채움 포인터가 있는 조정 가능 배열을 준비하고, 그곳으로 출력을 덧붙여 최종 문자열을 얻게 돼요.
부수 효과 (Side Effects)
string이 수정돼요.
특이 상황 (Exceptional Situations)
호출의 동적 지속 기간 동안 string에 직접 파괴적 수정(destructive modification)을 수행하면 결과는 정의되지 않아요(undefined).
참고 (Notes)
없음.
더 알아보기
make-string-output-stream— 문자열 출력 스트림 생성 함수vector-push-extend— 벡터에 요소 추가 함수- Section 3.6 — 순회 규칙과 부수 효과