The StringCvt 구조
The StringCvt 구조
문자열 변환(scanning)의 공통 시그니처와 유틸리티를 제공해요.
출처: 문서
본문
시놉시스 (Synopsis)
signature STRING_CVT
structure StringCvt :> STRING_CVT
인터페이스 (Interface)
datatype radix = BIN | OCT | DEC | HEX
datatype realfmt
= SCI of int option
| FIX of int option
| GEN of int option
| EXACT
type ('a,'b) reader = 'b -> ('a * 'b) option
val padLeft : char -> int -> string -> string
val padRight : char -> int -> string -> string
val splitl : (char -> bool)
-> (char, 'a) reader -> 'a -> string * 'a
val takel : (char -> bool)
-> (char, 'a) reader -> 'a -> string
val dropl : (char -> bool) -> (char, 'a) reader -> 'a -> 'a
val skipWS : (char, 'a) reader -> 'a -> 'a
type cs
val scanString : ((char, cs) reader -> ('a, cs) reader)
-> string -> 'a option
설명 (Description)
datatype radix = BIN | OCT | DEC | HEX
scanString은 기반 읽기 함수 위에 문자열 스캐너를 만들어요.
datatype realfmt
= SCI of int option
| FIX of int option
| GEN of int option
| EXACT
padLeft·padRight는 문자열을 지정 폭으로 채워요.
type ('a,'b) reader = 'b -> ('a * 'b) option
문자 스트림을 나타내는 타입과 getc·lookahead·split 연산을 제공해요.
padLeft c i s
padRight c i s
이 함수들은 s를 각각 왼쪽 혹은 오른쪽에 문자 c를 i - |s|개만큼 채워 돌려줘요. |s|가 i 이상이면 문자열 s를 그대로 돌려줘요. 다시 말해 이 함수들은 s를 i자 너비 필드에서 오른쪽·왼쪽 정렬하며 s의 어떤 부분도 잘라내지 않아요. i가 0 이하이면 s를 돌려준다는 점에 유의하세요. 결과 문자열의 크기가 String.maxSize보다 커지면 Size 예외를 발생시켜요.
splitl f rdr src
src에서 모든 문자가 f를 만족하는 가장 긴 접두사(왼쪽 부분 문자열) pref와 나머지 src'를 돌려줘요. 여기서 pref는 문자 리더 rdr에 의해 생성돼요. 따라서 src'에서 얻을 수 있는 첫 번째 문자는 f를 만족하지 않는 가장 왼쪽 문자가 돼요. splitl은 SOME과 합성하면 scanString 같은 스캔 함수와 함께 쓸 수 있어요. 예: scanString (fn rdr => SOME o (splitl f rdr)).
takel f rdr src
dropl f rdr src
이 루틴들은 소스 src에서 술어 f를 만족하지 않는 첫 번째 문자를 찾아요. dropl은 술어를 만족하는 문자로 이루어진 최대 접두사를 버리고 소스의 나머지를 돌려주는 반면, takel은 술어를 만족하는 문자로 이루어진 최대 접두사를 돌려줘요. 이 함수들은 splitl로 다음과 같이 정의할 수 있어요:
takel f rdr s = #1(splitl f rdr s)
dropl f rdr s = #2(splitl f rdr s)
skipWS rdr src
리더 rdr을 사용해 스트림 src에서 공백 문자를 제거해요. 남은 스트림을 돌려줘요. 공백 문자는 Char.isSpace 술어를 만족하는 문자예요. 이 함수는 dropl Char.isSpace와 동등해요.
type cs
scanString이 사용하는 문자 스트림의 추상 타입이에요. 이 타입의 값은 문자 스트림의 상태를 나타내요. 구현이 표현 방식을 선택할 수 있도록 구체 타입은 명시하지 않아요. 일반적으로 cs는 문자열에 대한 정수 인덱스가 돼요.
val scanString : ((char, cs) reader -> ('a, cs) reader)
-> string -> 'a option
scanString 함수는 문자열을 어떤 값으로 변환하는 일반적인 틀을 제공해요. 사용자는 스캔 함수와 문자열을 제공해요. scanString은 문자열을 문자 소스(타입 cs)로 변환하고 스캔 함수를 적용해요. 스캔 함수는 문자 리더를 원하는 타입의 값 리더로 변환해요. 대표적인 스캔 함수로 Bool.scan과 Date.scan이 있어요.