The CHAR 시그니처

The CHAR 시그니처

CHAR 시그니처는 문자 타입 char를 정의하고, 그 타입 값에 대한 기본 연산과 술어를 제공해요. 문자에는 선형 순서가 정의돼 있어요. 또한 문자를 선형 순서를 보존하는 연속된 음이 아닌 정수 범위로 인코딩하는 방법도 있어요. CHAR 시그니처에 일치하는 구조는 두 개인데, Char 구조는 확장 ASCII 8비트 문자 집합과 그에 대한 로케일 독립 연산을 제공해요. 이 구조에서 Char.maxOrd = 255예요. 선택적인 WideChar 구조는 고정된 개수의 8비트 워드(바이트)로 표현되는 와이드 문자를 정의해요. WideChar 구조가 제공되면 Char 구조와 구별돼요.

출처: 문서

본문

시놉시스 (Synopsis)

signature CHAR
structure Char :> CHAR
where type char = char
where type string = String.string
structure WideChar :> CHAR (* OPTIONAL *)
where type string = WideString.string

인터페이스 (Interface)

eqtype char
eqtype string
val minChar : char
val maxChar : char
val maxOrd : int
val ord : char -> int
val chr : int -> char
val succ : char -> char
val pred : char -> char
val compare : char * char -> order
val < : char * char -> bool
val <= : char * char -> bool
val > : char * char -> bool
val >= : char * char -> bool
val contains : string -> char -> bool
val notContains : string -> char -> bool
val isAscii : char -> bool
val toLower : char -> char
val toUpper : char -> char
val isAlpha : char -> bool
val isAlphaNum : char -> bool
val isCntrl : char -> bool
val isDigit : char -> bool
val isGraph : char -> bool
val isHexDigit : char -> bool
val isLower : char -> bool
val isPrint : char -> bool
val isSpace : char -> bool
val isPunct : char -> bool
val isUpper : char -> bool
val toString : char -> String.string
val scan : (Char.char, 'a) StringCvt.reader
-> (char, 'a) StringCvt.reader
val fromString : String.string -> char option
val toCString : char -> String.string
val fromCString : String.string -> char option

설명 (Description)

val minChar : char

순서에서 가장 작은 문자예요. 항상 chr 0과 같아요.

val maxChar : char

순서에서 가장 큰 문자예요. chr maxOrd와 같아요.

val maxOrd : int

가장 큰 문자 코드예요. ord maxChar와 같아요.

ord c

문자 c의 (음이 아닌) 정수 코드를 돌려줘요.

chr i

코드가 i인 문자를 돌려줘요. i < 0이거나 i > maxOrd이면 Chr를 발생시켜요.

succ c

순서에서 c 바로 다음 문자를 돌려주거나, c = maxChar이면 Chr를 발생시켜요. 정의되는 경우 succ cchr(ord c + 1)과 동등해요.

pred c

순서에서 c 바로 앞 문자를 돌려주거나, c = minChar이면 Chr를 발생시켜요. 정의되는 경우 pred cchr(ord c - 1)과 동등해요.

compare (c, d)

문자 순서에서 c가 d보다 앞서는지, 같거나, 뒤에 오는지에 따라 LESS, EQUAL, GREATER를 돌려줘요.

val < : char * char -> bool
val <= : char * char -> bool
val > : char * char -> bool
val >= : char * char -> bool

이 함수들은 문자 순서에서 문자들을 비교해요. ordchr 함수가 순서를 보존한다는 점에 주의해요. 예를 들어 문자 x와 y에 대해 x < y라면 ord x < ord y도 참이에요.

contains s c

문자 c가 문자열 s에 나타나면 true, 아니면 false를 돌려줘요. 구현 참고: 일부 구현에서 containss에 부분 적용하면 테이블을 만들 수 있는데, 결과 함수는 이 테이블로 주어진 문자가 문자열에 있는지 판단해요. 그래서 val p = contains s는 계산이 비쌀 수 있지만 p c는 어떤 문자 c에 대해서도 빠를 수 있어요.

notContains s c

문자 c가 문자열 s에 나타나지 않으면 true, 나타나면 false를 돌려줘요. not(contains s c)와 동등해요. 구현 참고: contains와 마찬가지로 notContains도 테이블 조회로 구현될 수 있어요.

isAscii c

c가 (7비트) ASCII 문자, 즉 0 <= ord c <= 127이면 true를 돌려줘요. 이 함수는 로케일과 무관하다는 점에 주의해요.

toLower c

c가 문자(letter)면 그에 대응하는 소문자(각각 대문자)를 돌려주고, 아니면 c를 돌려줘요.

toUpper c

c가 문자(소문자 또는 대문자)면 true를 돌려줘요.

isAlpha c

c가 영숫자(문자 또는 십진 숫자)면 true를 돌려줘요.

isAlphaNum c

c가 제어 문자면 true를 돌려줘요.

isCntrl c

c가 십진 숫자 [0-9]면 true를 돌려줘요.

isDigit c

c가 그래픽 문자, 즉 인쇄 가능하고 공백 문자가 아니면 true를 돌려줘요.

isGraph c

c가 16진수 숫자 [0-9a-fA-F]면 true를 돌려줘요.

isHexDigit c

c가 소문자면 true를 돌려줘요.

isLower c

c가 인쇄 가능한 문자(공백 또는 보이는 문자), 즉 제어 문자가 아니면 true를 돌려줘요.

isPrint c

c가 공백 문자(공백, 줄바꿈, 탭, 캐리지 리턴, 세로 탭, 폼 피드)면 true를 돌려줘요.

isSpace c

c가 구두점 문자, 즉 그래픽이지만 영숫자가 아니면 true를 돌려줘요.

isPunct c

c가 대문자면 true를 돌려줘요.

isUpper c

필요하면 SML 이스케이프 시퀀스를 사용해 문자의 인쇄 가능한 문자열 표현을 돌려줘요. 백슬래시와 큰따옴표 문자를 제외한 인쇄 가능한 문자는 그대로 두어요. 백슬래시는 두 개의 백슬래시로, 큰따옴표는 백슬래시 뒤 큰따옴표로 표기돼요. 일반적인 제어 문자는 두 문자 이스케이프 시퀀스로 변환돼요: 경보(0x07)는 a, 백스페이스(0x08)는 b, 가로 탭(0x09)은 t, 줄바꿈(0x0A)은 n, 세로 탭(0x0B)은 v, 폼 피드(0x0C)는 f, 캐리지 리턴(0x0D)은 r이며 각각 백슬래시를 앞에 붙여요. 코드가 32 미만인 나머지 문자는 "제어 문자" 표기법의 세 문자 문자열로 표현돼요. 예를 들어 코드 0은 ^@, 코드 1은 ^A로 표기돼요. 코드가 999보다 큰 문자는 "\uxxxx" 형태의 6자 문자열로 매핑되고, xxxx는 네 자리 16진수 코드예요. 그 외의 문자(코드 126 초과 1000 미만)는 "\ddd" 형태의 4자 문자열로 매핑되고, ddd는 세 자리 십진수 코드예요. 문자를 담은 길이 1 문자열로 변환하려면 String.str을 쓰면 돼요.

toString c

이 함수들은 문자(공백 포함 가능) 또는 문자를 나타내는 SML 이스케이프 시퀀스를 문자 스트림이나 인쇄 가능한 문자 문자열의 접두부에서 스캔해요(SML 프로그램에서 허용되는 대로). 성공적으로 변환한 뒤 scan은 남은 스트림을 문자와 함께 돌려주고, fromString은 s의 추가 문자를 무시하고 문자만 돌려줘요. 첫 문자가 인쇄 불가(즉 ASCII 범위 [0x20,0x7E] 밖)이거나 잘못된 이스케이프 시퀀스로 시작하면 변환이 불가능해 NONE이 돌아가요. fromStringStringCvt.scanString scan과 동등해요.

scan getc strm

c에 대응하는 인쇄 가능한 문자열을 돌려주되, 인쇄 불가 문자를 C 이스케이프 시퀀스로 바꿔요. 백슬래시, 큰따옴표, 물음표, 작은따옴표를 제외한 인쇄 가능한 문자는 그대로 두고, 백슬래시는 두 개의 백슬래시로, 큰따옴표는 백슬래시 뒤 큰따옴표로, 물음표는 백슬래시 뒤 물음표로, 작은따옴표는 백슬래시 뒤 작은따옴표로 표기돼요. 일반 제어 문자는 두 문자 이스케이프 시퀀스로 변환되고(위와 동일), 그 외 모든 문자는 백슬래시가 앞에 붙은 세 자리 8진수 코드로 표현돼요.

fromString s

문자(공백 포함 가능) 또는 문자를 나타내는 C 이스케이프 시퀀스를 문자열 접두부에서 스캔해요. 성공적으로 변환한 뒤 fromCString은 s의 추가 문자를 무시해요. 변환이 불가능하면(예: 첫 문자가 인쇄 불가, 즉 ASCII 범위 [0x20-0x7E] 밖이거나 잘못된 이스케이프 시퀀스로 시작) NONE이 돌아가요. 허용 이스케이프 시퀀스는 ISO C 표준 ISO/IEC 9899:1990의 6.1.3.4절을 참조해요. fromCString은 이스케이프되지 않은 작은따옴표는 받지만 이스케이프되지 않은 큰따옴표는 받지 않는다는 점에 주의해요. 8진수·16진수 숫자가 포함된 이스케이프 시퀀스에서는 가장 긴 숫자 시퀀스로 취해요. 결과 값이 문자 집합으로 표현될 수 없으면 NONE이 돌아가요.

toCString c

c에 해당하는 인쇄 가능한 문자열을 돌려줘요. 인쇄할 수 없는 문자는 C 이스케이프 시퀀스로 대체돼요. 구체적으로 백슬래시, 큰따옴표, 물음표, 작은따옴표를 제외한 인쇄 가능한 문자는 그대로 둬요. 백슬래시는 \, 큰따옴표는 ", 물음표는 ?, 작은따옴표는 '로 이스케이프돼요. 일반적인 제어 문자는 두 글자 이스케이프 시퀀스로 변환돼요: 경고(Alert, ASCII 0x07) \a 백스페이스(Backspace, ASCII 0x08) \b 수평 탭(ASCII 0x09) \t 개행(Linefeed, ASCII 0x0A) \n 수직 탭(ASCII 0x0B) \v 용지 먹임(Form feed, ASCII 0x0C) \f 캐리지 리턴(ASCII 0x0D) \r 그 외 모든 문자는 백슬래시가 앞에 붙은, 해당 문자의 코드에 해당하는 세 자리 8진수로 표현돼요.

fromCString s

문자(공백 포함)나 문자를 나타내는 C 이스케이프 시퀀스를 문자열의 접두부에서 스캔해요. 변환이 성공하면 fromCString은 s에 있는 추가 문자는 무시해요. 첫 문자가 인쇄할 수 없거나(즉 ASCII 범위 [0x20-0x7E]에 없거나) 잘못된 이스케이프 시퀀스로 시작하는 등 변환이 불가능하면 NONE을 돌려줘요. 허용되는 이스케이프 시퀀스는 아래와 같아요 (ISO C 표준 ISO/IEC 9899:1990[CITE]의 6.1.3.4절 참조). \a 경고(Alert, ASCII 0x07) \b 백스페이스(Backspace, ASCII 0x08) \t 수평 탭(ASCII 0x09) \n 개행(Linefeed, ASCII 0x0A) \v 수직 탭(ASCII 0x0B) \f 용지 먹임(Form feed, ASCII 0x0C) \r 캐리지 리턴(ASCII 0x0D) \? 물음표 \\ 백슬래시 \" 큰따옴표 \' 작은따옴표 \^c 문자 c의 ord c가 [64,95] 범위에 있을 때 인코딩이 ord c - 64인 제어 문자. 예를 들어 \^H(control-H)는 \b(백스페이스)와 같아요. \ooo 인코딩이 8진수 ooo인 문자 (ooo는 한 자리에서 세 자리 8진수) \xhh 인코딩이 16진수 hh인 문자 (hh는 16진수 시퀀스). fromCString은 이스케이프되지 않은 작은따옴표 문자는 받아들이지만, 이스케이프되지 않은 큰따옴표 문자는 받아들이지 않는다는 점에 유의하세요. 8진수나 16진수를 포함한 이스케이프 시퀀스에서 숫자 시퀀스는 그런 문자의 가장 긴 시퀀스로 간주돼요. 결과 값을 문자 집합으로 표현할 수 없으면 NONE을 돌려줘요.## 더 알아보기 (Learn more)