토파즈 배우기

문법 한눈에 보기

자주 쓰는 토파즈 문법과 예제의 결과를 찾아보세요. 각 카드에서 자세한 규칙으로 이동할 수 있습니다.

필요한 문법 예제를 찾고 각 카드의 매뉴얼 링크에서 자세한 규칙을 확인하세요. 처음이라면 첫 프로그램과 학습 경로부터 시작하고, 이 페이지는 참고용으로 곁에 두세요.

일상적으로 쓰는 문법

주요 문법을 훑어보거나 필요한 카드로 바로 이동하세요. 모듈 카드와 프로젝트 명령 카드에는 필요한 파일을 만드는 안내가 연결돼 있습니다.

값, 바인딩, 타입

값에 이름을 붙이고 다시 대입할 수 있는 이름을 고르세요.

TOPAZ
const 기본_분 = 25
let 제목: string = "Check program"
let mut 완료수: int = 0
완료수 = 완료수 + 1

완료수는 1이 됩니다. const에는 검사 시점에 알 수 있는 값이 필요합니다. let으로 붙인 이름에는 다시 대입할 수 없습니다. let mut는 재대입을 허용합니다. : 타입으로 타입을 명시하거나 검사기가 알아내게 둘 수 있습니다.

형식 let 이름: 타입 = 표현식

매뉴얼 타입

함수와 람다

계산을 함수로 묶어 다시 쓰거나, 짧은 함수를 값으로 전달하세요.

TOPAZ
function 두배(값: int) -> int {
    값 * 2
}

let 증가: (int) -> int = 값 => 값 + 1
print("{두배(증가(3))}")

8을 출력합니다. 증가에는 이름 없이 짧게 쓴 함수인 람다가 들어 있습니다. 두배는 입력과 반환 타입을 선언하고 마지막 표현식을 반환합니다. return을 써도 됩니다.

형식 function 이름(값: 타입) -> 결과 { 표현식 }, 값 => 표현식

매뉴얼 함수와 제네릭

연산자와 표현식의 결과

블록의 마지막 표현식을 결과로 쓰세요.

TOPAZ
let 합계 = {
    let 기준 = 20
    기준 + 5
}
print("{합계}")

25를 출력합니다. 블록, if, match, 값 자리에 쓰는 for는 결과를 낼 수 있습니다. 대입은 문장이므로 마지막 결과로 쓸 수 없습니다.

형식 { 문장; 마지막표현식 }

매뉴얼 연산자와 표현식

if, match, for

if나 match로 분기를 고르고 for로 결과를 모으세요.

TOPAZ
let 점수들 = [92, 74]
let 등급들 = for 점수 in 점수들 {
    match 점수 {
        case 90..100 => "A"
        case _ => if 점수 >= 70 {
            "pass"
        } else {
            "retry"
        }
    }
}

등급들은 ["A", "pass"]입니다. for는 점수마다 결과 하나를 모아 Array<string>을 만듭니다. if는 불리언 조건을 검사하고 match는 패턴에 따라 분기를 고릅니다.

형식 if 조건 { 값 } else { 값 }, match 값 { case 패턴 => 값 }, for 항목 in 값들 { 값 }

매뉴얼 패턴과 제어 흐름

배열, 맵, 셋

값을 순서대로 저장하거나, 키로 값을 찾거나, 중복을 없애세요.

TOPAZ
let 점수들: Array<int> = [80, 90]
let 식별자들 = set { 3, 1, 3 }
let 레이블들 = map { 1: "one", 2: "two" }

print("{점수들}:{식별자들.toArray()}:{레이블들.keys}")

[80, 90]:[3, 1]:[1, 2]를 출력합니다. Array<T>는 인덱스 순서대로 값을 보관합니다. Map<K, V>는 키로 값을 찾고, Set<T>는 각 값을 한 번씩 저장합니다. 맵과 셋은 삽입 순서를 유지합니다. 맵 리터럴에 같은 키를 반복하면 오류입니다.

형식 [a, b], map { 키: 값 }, set { a, b }

매뉴얼 컬렉션과 컴프리헨션

레코드, 열거형, 유니온

레코드로 필드를 묶고, 열거형으로 선택지를 나열하고, 유니온으로 타입을 합치세요.

TOPAZ
record 과제 {
    제목: string,
    완료: bool = false,
}

enum 필터 {
    전체,
    열림,
}

type 선택 = 과제 | null
let 선택값: 선택 = null

선택값은 null이므로 과제가 없습니다. 과제는 이름 있는 필드를 묶고, 필터는 가능한 선택지를 나열하며, 과제 | null은 두 타입을 모두 허용합니다. 레코드와 열거형은 명목 타입입니다. 필드가 같아도 따로 선언하면 서로 다른 타입입니다.

형식 record 이름 { 필드 }, enum 이름 { 선택지 }, type 선택 = A | B

매뉴얼 레코드와 명목 데이터

값 없음, 복구 가능한 실패, 실행 오류, 정리

호출자가 처리할 수 있는 오류를 반환하고, 함수를 나갈 때 열었던 파일을 닫으세요.

TOPAZ
function 계획읽기(경로: string) -> Result<string, string> {
    let 파일 = open(경로)?
    defer { 파일.close() }

    파일.read()
}

계획읽기를 호출하면 파일 내용이나 오류를 Result로 돌려줍니다. ?는 Ok에서 값을 꺼내거나 Err를 호출자에게 반환합니다. defer는 중간에 반환해도 스코프를 나갈 때 파일을 닫습니다. 값이 없을 수 있다면 Some과 None을 갖는 Option<T>를 쓰세요. 잘못된 배열 인덱스 같은 실행 오류는 프로그램을 중단하며 ?로 잡을 수 없습니다.

형식 Some(값) / None, Ok(값) / Err(오류), 결과?, defer { 정리 }

매뉴얼 Null·Option·결과·fault

문자열과 템플릿

문자열에 값을 넣거나 경로를 템플릿으로 보관하세요.

TOPAZ
let 이름 = "Topaz"
let 인사 = "Hello, {이름}!"
let 경로 = p"notes/{이름}.txt"

인사는 "Hello, Topaz!"입니다. p 태그는 경로 템플릿을 만듭니다. 다른 내장 태그로는 정규식의 r, 셸 명령의 sh, 매개변수화된 SQL의 sql이 있습니다. 템플릿을 만든다고 실행 환경의 해당 작업이 실행되지는 않습니다. 백틱 템플릿, 달러·중괄호 보간, HTML 태그, 사용자 정의 태그는 지원하지 않습니다.

형식 "텍스트 {값}", 태그"텍스트 {값}"

매뉴얼 문자열과 템플릿

모듈과 가시성

다른 파일에서 선언을 가져오세요. 아래 코드는 src/plan.tpz가 학습과제와 요약을 공개한다고 가정합니다. 전체 파일은 첫 애플리케이션을 따라 만드세요.

TOPAZ
import src.plan { 학습과제, 요약 }

export function 요약문(과제들: Array<학습과제>) -> string {
    요약(과제들)
}

.tpz 파일 하나가 모듈입니다. 가져오기는 파일 맨 위에 쓰세요. 점으로 구분한 경로는 컴파일 루트에서 시작하므로 src.plan은 src/plan.tpz를 가리킵니다. 다른 모듈에서는 export로 공개한 선언을 가져올 수 있습니다. 위 코드는 지정한 두 선언을 가져오며 비공개 선언에는 접근할 수 없습니다.

형식 import 모듈.경로 { 이름 }, export function 이름(...)

매뉴얼 모듈과 가시성

포맷, 검사, 테스트, 실행, 빌드

패키지를 작성할 때 아래 명령을 쓰세요. 작업 폴더에 패키지 매니페스트, 잠금 파일, tests/plan.tpz가 있어야 합니다. 첫 애플리케이션을 따라 이 파일들을 만드세요.

BASH
topaz fmt --check --root .
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked
topaz build --release --root . --locked --out-dir build

fmt --check는 서식 차이를 알리고 파일은 바꾸지 않습니다. check는 프로그램을 실행하지 않고 소스 오류를 알립니다. test는 테스트 결과를, run은 프로그램 출력을 보여 줍니다. build는 네이티브 실행 파일과 필요한 파일들을 build 폴더에 만듭니다. 네이티브 빌드에는 플랫폼에 맞는 Rust와 Cargo가 필요합니다. 각 명령은 성공하면 종료 코드 0을 반환합니다. 예상 출력은 연결된 실습에서 확인하세요.

형식 topaz <작업> [입력]

매뉴얼 CLI와 진단

더 나아갈 경로

프로그램에 필요한 주제를 골라 보세요.

첫 애플리케이션을 단계별로 만들려면 학습 경로로 돌아가세요. 값과 함수, 데이터와 제어, 실패와 리소스를 익힌 뒤 첫 애플리케이션으로 이어집니다.