The INTEGER 시그니처
The INTEGER 시그니처
INTEGER 시그니처의 인스턴스는 고정 또는 임의 정밀도의 부호 있는 정수 타입과 산술·변환 연산을 제공해요. 고정 정밀도 구현에서 대부분의 산술 연산은 결과가 표현 불가능할 때 Overflow 예외를 발생시켜요.
출처: 문서
본문
시놉시스 (Synopsis)
signature INTEGER
structure Int :> INTEGER
where type int = int
structure FixedInt :> INTEGER (* OPTIONAL *)
structure LargeInt :> INTEGER
structure Int<N> :> INTEGER (* OPTIONAL *)
structure Position :> INTEGER
인터페이스 (Interface)
eqtype int
val toLarge : int -> LargeInt.int
val fromLarge : LargeInt.int -> int
val toInt : int -> Int.int
val fromInt : Int.int -> int
val precision : Int.int option
val minInt : int option
val maxInt : int option
val + : int * int -> int
val - : int * int -> int
val * : int * int -> int
val div : int * int -> int
val mod : int * int -> int
val quot : int * int -> int
val rem : int * int -> int
val compare : int * int -> order
val < : int * int -> bool
val <= : int * int -> bool
val > : int * int -> bool
val >= : int * int -> bool
val ~ : int -> int
val abs : int -> int
val min : int * int -> int
val max : int * int -> int
val sign : int -> Int.int
val sameSign : int * int -> bool
val fmt : StringCvt.radix -> int -> string
val toString : int -> string
val scan : StringCvt.radix
-> (char, 'a) StringCvt.reader
-> (int, 'a) StringCvt.reader
val fromString : string -> int option
설명 (Description)
val toLarge : int -> LargeInt.int
val fromLarge : LargeInt.int -> int
이 함수들은 타입 int와 LargeInt.int의 정수 값 사이를 변환해요. 후자는 값이 맞지 않으면 Overflow를 발생시켜요. Int<M>.fromLarge o Int<N>.toLarge는 타입 Int
val toInt : int -> Int.int
val fromInt : Int.int -> int
이 함수들은 타입 int와 기본 정수 타입 사이의 정수 값을 변환해요. 값이 맞지 않으면 Overflow를 발생시켜요.
val precision : Int.int option
SOME(n)이면 타입 int의 유효 비트 수 n(부호 비트 포함)을 나타내요. NONE이면 int는 임의 정밀도예요. 정밀도가 반드시 2의 거듭제곱일 필요는 없어요.
val minInt : int option
val maxInt : int option
int가 표현할 수 있는 각각 최소(가장 음수)와 최대(가장 양수) 정수예요. 값이 NONE이면 int는 힙 크기 한계 내에서 모든 음수(각각 양수) 정수를 표현할 수 있어요. precision이 SOME(n)이면 minInt = -2(n-1)이고 maxInt = 2(n-1) - 1이에요.
val + : int * int -> int
val - : int * int -> int
val * : int * int -> int
이 함수들은 각각 인자의 합, 차, 곱을 돌려줘요. 결과가 표현 불가능하면 Overflow를 발생시켜요.
i div j
j로 나눈 i의 몫 이하의 가장 큰 정수, 즉 floor((i / j))를 돌려줘요. 결과가 표현 불가능하면 Overflow를, j = 0이면 Div를 발생시켜요. 반올림은 0이 아니라 음의 무한대 방향이라는 점에 주의해요.
i mod j
i를 j로 나눈 나머지를 돌려줘요. j = 0이면 Div를 발생시켜요. 정의될 때 (i mod j)는 j와 같은 부호를 가져요.
(i div j) * j + (i mod j) = i
quot (i, j)
i를 j로 나눈 잘린 몫, 즉 (i / j)를 계산한 다음 몫의 분수 부분을 버려요. 결과가 표현 불가능하면 Overflow, j = 0이면 Div를 발생시켜요. div와 달리 quot는 0 방향으로 반올림해요. 또한 div·mod와 달리 quot와 rem은 기본적으로 중위(infix)가 아니며, 적절한 중위 선언은 infix 7 quot rem이에요. 구현 참고: 이것은 대부분의 하드웨어 나눗셈 명령의 의미라 quot가 div보다 빠를 수 있어요.
i rem j
i를 j로 나눈 나머지를 돌려줘요. j = 0이면 Div를 발생시켜요. (i rem j)는 i와 같은 부호를 가져요. 이것은 대부분의 하드웨어 나눗셈 명령의 의미라 rem이 mod보다 빠를 수 있어요.
(i quot j) * j + (i rem j) = i
compare (i, j)
i가 j보다 작거나, 같거나, 크면 각각 LESS, EQUAL, GREATER를 돌려줘요.
val < : int * int -> bool
val <= : int * int -> bool
val > : int * int -> bool
val >= : int * int -> bool
두 정수 사이에 해당 관계가 성립하면 true를 돌려줘요.
~ i
i의 부정, 즉 (0 - i)를 돌려줘요. 결과가 표현 불가능하면 Overflow를 발생시켜요. 예를 들어 int가 n비트 2의 보수 정수 타입이고 ~를 -2(n-1)에 적용할 때 발생할 수 있어요.
abs i
i의 절대값(크기)을 돌려줘요. 결과가 표현 불가능하면 Overflow를 발생시켜요.
val min : int * int -> int
val max : int * int -> int
이 함수들은 각각 인자 중 더 작은(더 큰) 값을 돌려줘요.
sign i
i가 0보다 작거나, 같거나, 크면 각각 ~1, 0, 1을 돌려줘요.
sameSign (i, j)
i와 j가 같은 부호를 가지면 true를 돌려줘요. (sign i = sign j)와 동등해요.
fmt radix i
이 함수들은 음수 부호로 "~"를 사용하는 i의 표현을 담은 문자열을 돌려줘요. 전자는 radix에 따라 문자열을 형식화해요. 10부터 15까지의 16진 숫자는 각각 "A"부터 "F"로 표현돼요. 16진 표현에는 "0x" 접두어가 붙지 않아요. 두 번째 형태는 fmt StringCvt.DEC i와 동등해요.
toString i
첫 번째 식은 초기 공백을 건너뛴 뒤 문자 스트림 strm 접두부에서 radix가 나타내는 형식의 정수를 파싱할 수 있으면 SOME(i,rest)를 돌려줘요. i는 파싱한 정수의 값, rest는 문자 스트림 나머지예요. 그렇지 않으면 NONE을 돌려줘요. 이 함수는 정수를 파싱할 수 있는데 타입 int로 표현하기엔 너무 크면 Overflow를 발생시켜요. scan이 받는 형식은 radix 인자에 따라 달라져요. BIN은 [+~-]?[0-1]+, OCT는 [+~-]?[0-7]+, DEC는 [+~-]?[0-9]+, HEX는 [+~-]?(0x | 0X)?[0-9a-fA-F]+예요. "0xg", "0x 123" 같은 문자열은 16진 radix를 써도 SOME(0)으로 스캔된다는 점에 주의해요. 두 번째 식은 문자열 s 접두부, 초기 공백을 무시하고, 형식 [+~-]?[0-9]+의 정수 i를 파싱할 수 있으면 SOME(i)를 돌려주고 아니면 NONE을 돌려줘요. fromString은 정수를 파싱할 수 있는데 타입 int에 맞지 않게 크면 Overflow를 발생시켜요. StringCvt.scanString (scan StringCvt.DEC)와 동등해요.
scan radix getc strm
fromString s
첫 번째 식은 초기 공백을 건너뛴 뒤 문자 스트림 strm의 접두부에서 radix가 나타내는 형식의 정수를 파싱할 수 있으면 SOME(i,rest)를 돌려줘요. 여기서 i는 파싱한 정수의 값, rest는 문자 스트림 나머지예요. 그렇지 않으면 NONE을 돌려줘요. 이 함수는 정수를 파싱할 수 있는데 타입 int로 표현하기엔 너무 크면 Overflow를 발생시켜요. scan이 받는 형식은 radix 인자에 따라 달라져요. 이 형식을 정의하는 정규식은 다음과 같아요: Radix 형식 StringCvt.BIN [+~-]?[0-1]+ StringCvt.OCT [+~-]?[0-7]+ StringCvt.DEC [+~-]?[0-9]+ StringCvt.HEX [+~-]?(0x | 0X)?[0-9a-fA-F]+ "0xg", "0x 123" 같은 문자열은 16진 radix를 사용해도 SOME(0)으로 스캔된다는 점에 유의하세요. 두 번째 식은 문자열 s의 접두부, 초기 공백을 무시하고, 형식 [+~-]?[0-9]+의 정수 i를 파싱할 수 있으면 SOME(i)를 돌려주고, 그렇지 않으면 NONE을 돌려줘요. fromString은 정수를 파싱할 수 있는데 타입 int에 맞지 않게 크면 Overflow를 발생시켜요. 이 식은 StringCvt.scanString (scan StringCvt.DEC)와 동등해요.