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를 만족하지 않는 가장 왼쪽 문자가 돼요. splitlSOME과 합성하면 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.scanDate.scan이 있어요.

더 알아보기 (Learn more)