표준 라이브러리와 런타임

코어 라이브러리

숫자를 해석하고 문자열과 Option·Result를 다룹니다. 바이트 조립·검사합·압축 작업은 코드와 출력으로 확인합니다.

텍스트를 숫자로 바꾸고 값이 없는 경우를 처리해 보세요. 파일 형식에 필요한 바이트 조립과 압축 함수도 예제와 표에서 찾을 수 있습니다.

첫 프로그램에서 토파즈를 설치하세요. 각 예제는 별도의 .tpz 파일로 저장하고 그 폴더에서 실행합니다.

값을 해석하고 변환하기

다음 코드를 core-everyday.tpz로 저장하세요.

TOPAZ
function 모두해석(값들: Array<string>) -> Array<Option<int>> {
    return map(값들, 값 => toInt(값))
}

let 스칼라들 = "토파즈".scalars()
let 해석값 = 모두해석(["1", "x", "3"])
print("{스칼라들.length}:{해석값}")

topaz run core-everyday.tpz를 실행하세요.

출력
3:[Some(1), None, Some(3)]

toInt는 "1"과 "3"을 정수로 바꿉니다. "x"에서는 None을 반환하므로 map의 결과에도 값 없음이 남습니다. "x"를 "2"로 바꾸면 가운데 결과가 Some(2)가 됩니다.

"토파즈"에는 유니코드 스칼라가 세 개 있습니다. 스칼라는 서로게이트 범위를 제외한 유니코드 코드 포인트 하나입니다. scalars()는 각 스칼라를 문자열로 담은 배열을 반환합니다. 이 배열의 길이는 스칼라 수이며 바이트 수나 눈에 보이는 글자 수와 다를 수 있습니다.

print는 문자열을 받습니다. {...} 안의 보간식은 값을 텍스트로 바꾼 뒤 출력합니다.

일상 도우미 선택하기

하려는 일호출반환 타입
한 줄 출력print(text)()
이번 실행에 전달된 텍스트 전체 읽기input()string
정수 해석toInt(text)Option<int>
2~36진수로 해석toIntRadix(text, radix)Option<int>
정수를 부동소수점 수로 변환toFloat(value)float
코드 포인트에서 스칼라 생성fromCodePoint(value)Option<string>
문자열을 스칼라 문자열로 나누기text.scalars()Array<string>
원소 변환·선택·누적map, filter, reduce새 값

input()은 한 번의 실행에서 호출할 때마다 같은 전체 텍스트를 반환합니다. input과 print를 쓰려면 실행 환경이 입력과 출력을 지원해야 합니다.

toFloat는 int를 받습니다. 정수가 담긴 텍스트는 먼저 toInt로 해석하세요. 값을 텍스트로 바꿀 때는 보간식을, 배열 원소 수를 셀 때는 .length를 씁니다. 독립 함수 toString, len, println, type_of는 없습니다.

Option과 Result 변환하기

Some, None은 Option을 만들고 Ok, Err는 Result를 만듭니다. 컴파일러가 타입 인수를 모두 추론할 수 없으면 타입 표기를 추가하세요. None, Ok, Err, 빈 컬렉션에서 이런 경우가 생길 수 있습니다.

메서드시그니처동작
option.okOr(error: E) -> Result<T, E>호출 전에 error를 평가
option.okOrElse(f: () -> E) -> Result<T, E>값이 None이면 f 호출
option.map(f: (T) -> U) -> Option<U>Some 안의 값 변환
option.flatMap(f: (T) -> Option<U>) -> Option<U>f의 Option을 중첩 없이 반환
result.map(f: (T) -> U) -> Result<U, E>Ok 안의 값 변환
result.flatMap(f: (T) -> Result<U, E>) -> Result<U, E>f의 Result를 중첩 없이 반환

map과 flatMap 메서드는 None이나 Err를 그대로 유지하며 f를 호출하지 않습니다. 독립 함수 map, filter, reduce는 배열 등 언어가 지원하는 순회 가능 타입에 사용합니다. 이 함수들은 실행 오류(fault)를 잡지 않습니다.

바이트를 제자리에서 조립하기

다음 코드를 core-byte-buffer.tpz로 저장하세요.

TOPAZ
let mut 행 = ByteBuffer.allocate(8)
행.fill(0, 8, 255)
행.set(0, 137)

let mut 프레임 = ByteBuffer.allocate(12)
프레임.copy(행, 0, 2, 8)
let 페이로드 = 프레임.toBytes()
print(페이로드.toHex())

topaz run core-byte-buffer.tpz를 실행하세요.

출력
000089ffffffffffffff0000

행에는 바이트 여덟 개가 들어갑니다. fill로 모두 255를 넣고 set으로 첫 바이트를 137로 바꿉니다. copy는 프레임의 인덱스 2부터 이 여덟 바이트를 복사합니다. 나머지 바이트는 0으로 남습니다.

ByteBuffer.allocate(length, value = 0)는 길이가 고정된 버퍼를 만듭니다. set, fill, copy를 호출하는 변수는 let mut으로 선언해야 합니다. 이 메서드는 쓰기 전에 모든 범위와 바이트 값을 검사합니다. 인수가 잘못되면 실행 오류가 나고 대상 버퍼는 그대로 남습니다.

버퍼를 대입하면 같은 버퍼를 공유합니다. ByteBuffer.fromBytes는 복사본을 만들고, toBytes()는 변경할 수 없는 스냅샷을 만듭니다. ByteBuffer는 비교하거나 Map 키·Set 원소로 쓸 수 없습니다. 텍스트·JSON으로 표시하거나 Web export로 전달할 수도 없습니다.

CRC-32 무결성 필드 계산하기

다음 코드를 core-crc32.tpz로 저장하세요.

TOPAZ
let 검사합 = Hash.crc32(Bytes.encodeUtf8("123456789"))
print("{검사합}")

topaz run core-crc32.tpz를 실행하세요.

출력
3421780262

Hash.crc32(data)는 CRC-32/ISO-HDLC 검사합을 0..4294967295 범위의 int로 반환합니다. std.hash.crc32도 같은 연산입니다. 파일 형식의 무결성 필드에 사용하세요. 데이터 인증이나 악의적인 변조 방지 기능은 제공하지 않습니다.

고정 DEFLATE 만들기

다음 코드를 core-deflate.tpz로 저장하세요.

TOPAZ
match Codec.deflateFixedCompress(Bytes.encodeUtf8("hello")) {
  case Ok(압축됨) => print(압축됨.toHex())
  case Err(오류) => print(오류)
}

topaz run core-deflate.tpz를 실행하세요.

출력
cb48cdc9c90700

Codec.deflateFixedCompress는 고정 허프만 코드를 쓰는 raw DEFLATE 블록 하나를 만듭니다. 같은 입력에서는 같은 바이트가 나옵니다. 출력에는 zlib·gzip 헤더나 검사합이 없습니다. 입력이 256 MiB를 넘으면 Err를 반환합니다.

고정 zlib 만들기

다음 코드를 core-zlib.tpz로 저장하세요.

TOPAZ
match Codec.zlibFixedCompress(Bytes.encodeUtf8("hello")) {
  case Ok(압축됨) => print(압축됨.toHex())
  case Err(오류) => print(오류)
}

topaz run core-zlib.tpz를 실행하세요.

출력
7801cb48cdc9c90700062c0215

Codec.zlibFixedCompress는 고정 허프만 압축 데이터에 78 01 헤더와 Adler-32 검사합을 붙입니다. 같은 입력에서는 같은 바이트가 나옵니다. 입력이 256 MiB를 넘으면 Err를 반환합니다.

이 함수에는 압축 해제, 압축 수준, 사전, 스트리밍 옵션이 없습니다. Adler-32를 따로 계산하는 기능도 제공하지 않습니다.

Reed–Solomon 보호 바이트 추가하기

다음 코드를 core-reed-solomon.tpz로 저장하세요.

TOPAZ
match Codec.reedSolomon255223Protect(Bytes.encodeUtf8("hello")) {
  case Ok(보호됨) => print("{보호됨.length()}")
  case Err(오류) => print(오류)
}

topaz run core-reed-solomon.tpz를 실행하세요.

출력
255

이 함수는 입력을 223바이트씩 나누고 각 블록 뒤에 패리티 바이트 32개를 붙여 RS(255,223) 코드워드를 만듭니다. 마지막 블록의 부족한 부분은 0으로 채웁니다. 데이터와 채움 바이트를 구별하려면 원래 입력 길이를 따로 보관하세요.

빈 입력이나 블록 65,535개를 넘는 입력은 Err를 반환합니다. 이 함수는 보호 바이트를 생성합니다. 손상된 데이터를 탐지하거나 복구하려면 디코더가 필요합니다.

관련 기능

타입 지정 JSON 호출에는 명시적이고 완전히 정해진 대상 타입 하나가 필요합니다. 데이터 오류가 나면 $로 시작하는 경로를 반환합니다. 독립 함수 assert에는 테스트 프로필이 필요합니다.

순회 가능한 값은 컬렉션 연산, 오류 처리는 Null·Option·결과·fault에서 확인하세요. 런타임 동작은 숫자 계산 결과를 설명합니다. 다른 작업은 표준 라이브러리 개요에서 찾으세요.