WITH-INPUT-FROM-STRING — 문자열에서 읽는 입력 스트림 매크로
WITH-INPUT-FROM-STRING — 문자열에서 읽는 입력 스트림 매크로
문자열을 마치 파일처럼 읽고 싶을 때 쓰는 매크로예요. 문자열에서 문자를 공급하는 입력 스트링 스트림(input string stream)을 만들어, 몸체 안에서 읽고 끝나면 자동으로 닫아줘요.
시그니처
with-input-from-string (var string &key index start end) declaration* form* => results*
본문
인자와 값 (Arguments and Values)
var— 변수 이름(variable name).string— 폼; 평가되어 문자열을 만들어요.index— place.start,end—string의 경계 인덱스 지정자(bounding index designator).start와end의 기본값은 각각 0과nil이에요.declaration—declare식; 평가되지 않아요.forms— 암묵적 progn.results—forms가 돌려준 값.
설명 (Description)
입력 스트링 스트림을 만들고, 그 스트림에 연산을 수행할 기회를 주고(값 0개 이상 반환), 그다음 스트링 스트림을 닫아요.
string을 먼저 평가하고, var를 결과 문자열에서 start와 end로 경계 지어진 부분 수열(subsequence)의 문자를 공급하는 문자 입력 스트링 스트림에 바인딩해요. 몸체는 암묵적 progn으로 실행돼요.
입력 스트링 스트림은 정상적으로 나가든 비정상적으로 나가든 with-input-from-string에서 나갈 때 자동으로 닫혀요. var가 바인딩된 입력 스트링 스트림은 동적 지속 기간(dynamic extent)을 가지며, 그 기간은 폼에서 나가면 끝나요.
index는 문자열 안에서 진행되는 포인터예요. with-input-from-string을 정상적으로 나가면 index는 읽지 않은 첫 번째 문자의 인덱스를 값으로 가져요. 모든 문자를 다 썼다면 그 값은 (length string)이에요. index가 지정한 place는 읽기가 진행될 때마다 갱신되는 게 아니라, 연산이 끝날 때만 갱신돼요.
start와 index가 같은 변수를 지정할 수 있는데, 이는 문자열 안에서 진행되는 포인터로, 몇몇 포함 루프가 반복해서 전진시킬 수도 있어요.
var 변수를 할당(assign)하려고 하면 결과는 정의되지 않아요(undefined).
예제 (Examples)
(with-input-from-string (s "XXX1 2 3 4xxx"
:index ind
:start 3 :end 10)
(+ (read s) (read s) (read s))) => 6
ind => 9
(with-input-from-string (s "Animal Crackers" :index j :start 6)
(read s)) => CRACKERS
첫 번째 예제에서 :start 3으로 앞의 XXX를 건너뛰고 1 2 3 4를 읽어 합 6을 얻고, ind는 읽지 않은 첫 문자 위치인 9가 돼요. 두 번째 예제에서 변수 j는 15로 설정돼요.
부수 효과 (Side Effects)
index가 지정한 place의 값(있다면)이 수정돼요.
특이 상황 (Exceptional Situations)
없음.
참고 (Notes)
없음.
더 알아보기
make-string-input-stream— 문자열 입력 스트림 생성 함수- Section 3.6 — 순회 규칙과 부수 효과