토파즈 배우기

문법 한눈에 보기

일상적인 토파즈 문법과 각 형식을 설명하는 정확한 매뉴얼 페이지를 10분 안에 훑어봅니다.

이 페이지는 강의나 축약된 명세가 아니라 문법 지도입니다. 카드마다 실용적인 질문 하나에 답하고, 정본 형식을 보여 준 뒤 세부 규칙을 맡은 매뉴얼 페이지로 안내합니다. 토파즈 프로그램을 처음 작성한다면 학습 경로에서 시작하고 이 페이지는 참고용으로 곁에 두세요.

일상적으로 쓰는 문법

언어의 전체 모습을 빠르게 파악하려면 카드를 순서대로 읽고, 필요한 형식이 정해져 있다면 바로 해당 카드로 이동하세요. 예제는 의도적으로 작습니다. 완전한 프로그램과 선언은 그 자체로 성립하며, 모듈 카드는 가정하는 파일 하나를 분명히 밝힙니다.

값, 바인딩, 타입

값은 프로그램이 다루는 데이터입니다. 검사 시점에 정해져야 하는 값은 const, 다시 대입하지 않는 지역 값은 let, 재대입이 모델의 일부라면 let mut로 이름을 붙입니다. 계약을 분명히 해야 할 때는 : 타입을 적고, 그렇지 않으면 토파즈가 타입을 추론합니다.

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

TOPAZ
const DEFAULT_MINUTES = 25
let title: string = "Check program"
let mut completed: int = 0
completed = completed + 1

매뉴얼: 타입

함수와 람다

이름 있는 함수는 재사용할 동작에 매개변수와 결과 계약을 명시합니다. 람다는 동작을 값으로 전달할 때 쓰는 간결한 익명 형식입니다. 함수 본문에서 return을 사용할 수도 있고, 마지막 표현식을 곧바로 결과로 삼을 수도 있습니다.

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

TOPAZ
function double(x: int) -> int {
    x * 2
}

let increment: (int) -> int = x => x + 1
print("{double(increment(3))}")

이 프로그램은 8을 출력합니다.

매뉴얼: 함수와 제네릭

연산자와 표현식의 결과

연산자는 값을 결합합니다. 블록, if, match, 값을 만드는 위치의 for도 저마다 결과를 낼 수 있습니다. 블록의 마지막 표현식에는 대입이나 별도의 반환 표시를 붙이지 않습니다. 그 표현식 자체가 블록의 결과입니다.

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

TOPAZ
let total = {
    let base = 20
    base + 5
}
print("{total}")

이 프로그램은 25를 출력합니다. 대입은 표현식이 아니라 문장입니다.

매뉴얼: 연산자와 표현식

if, match, for

불리언 조건으로 고를 때는 if, 값의 모양이나 경우에 따라 나눌 때는 match, 값을 정해진 순서로 방문할 때는 for를 사용합니다. 아래의 for는 값을 만드는 위치에 있으므로 점수마다 결과 하나를 모아 Array<string>을 만듭니다.

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

TOPAZ
let scores = [92, 74]
let labels = for score in scores {
    match score {
        case 90..100 => "A"
        case _ => if score >= 70 {
            "pass"
        } else {
            "retry"
        }
    }
}

labels["A", "pass"]입니다.

매뉴얼: 패턴과 제어 흐름

배열, 맵, 셋

순서가 있는 값은 Array<T>, 키로 값을 찾을 때는 Map<K, V>, 중복 없는 값은 Set<T>를 선택합니다. 배열은 위치 순서를 따르고, 맵과 셋은 명시된 삽입 순서를 유지합니다.

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

TOPAZ
let scores: Array<int> = [80, 90]
let ids = set { 3, 1, 3 }
let labels = map { 1: "one", 2: "two" }

print("{scores}:{ids.toArray()}:{labels.keys}")

반복된 3은 셋에서 한 자리만 차지합니다. 맵 리터럴에는 같은 키를 두 번 넣지 않습니다.

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

레코드, 열거형, 유니온

record는 필드로 이루어진 곱 타입에 이름을 붙입니다. enum은 닫힌 선택지에 이름을 붙입니다. |로 적는 유니온은 한 값이 나열된 타입 중 하나일 수 있음을 뜻하며, 외부 데이터의 값 없음을 나타내는 경계에서는 null을 포함할 수 있습니다.

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

TOPAZ
record Task {
    title: string,
    done: bool = false,
}

enum Filter {
    All,
    Open,
}

type Selection = Task | null
let selected: Selection = null

레코드와 열거형은 명목 타입입니다. 겉모양만이 아니라 선언된 정체성도 중요합니다.

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

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

예상 가능한 값 없음은 Option<T>, 호출자가 처리할 수 있는 실패는 Result<T, E>로 나타냅니다. 후위 ?Ok를 풀고, Err라면 같은 오류를 즉시 반환합니다. defer는 정리 작업을 어휘 스코프에 묶습니다. fault는 키워드나 값이 아니라 실행을 중단하는 경계이므로 ?로 잡을 수 없습니다.

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

TOPAZ
function readPlan(path: string) -> Result<string, string> {
    let file = open(path)?
    defer { file.close() }

    file.read()
}

파일 열기나 읽기 실패는 Result에 남습니다. 반면 잘못된 배열 인덱스는 실행 오류입니다.

매뉴얼: Null·Option·결과·실행 오류

문자열과 레지스트리 태그 템플릿

큰따옴표 문자열은 {표현식}으로 값을 끼워 넣습니다. 고정 레지스트리 태그 p, r, sh, sql은 경로, 정규식, 셸 명령, 매개변수화된 SQL에 필요한 구조를 보존합니다. 태그가 붙은 값을 만들었다고 해서 호스트 동작이 자동 실행되지는 않습니다.

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

TOPAZ
let name = "Topaz"
let greeting = "Hello, {name}!"
let path = p"notes/{name}.txt"

백틱 템플릿, 달러-중괄호 보간, HTML 태그, 사용자 정의 태그는 현재 토파즈 문법이 아닙니다.

매뉴얼: 문자열과 템플릿

모듈과 가시성

.tpz 파일 하나가 모듈 하나입니다. 점으로 구분한 모듈 경로는 컴파일 루트를 기준으로 해석합니다. 가져오기는 파일 앞부분에 모아 적으며, export로 표시한 선언만 다른 모듈에서 볼 수 있습니다.

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

src/plan.tpzStudyTasksummarize를 공개한다고 가정합니다.

TOPAZ
import src.plan { StudyTask, summarize }

export function summary(tasks: Array<StudyTask>) -> string {
    summarize(tasks)
}

선택 가져오기는 지정한 선언만 노출하며 모듈의 비공개 이름까지 열어 주지 않습니다.

매뉴얼: 모듈과 가시성

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

도구 모음은 작성부터 배포까지 같은 소스와 모듈 모델을 사용합니다. 먼저 형식을 맞추고 정적 검사를 통과시킨 다음 테스트를 실행하세요. 인터프리터로 동작을 확인하고, 실제로 배포할 대상만 빌드합니다.

형식: topaz <작업> [입력]

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

check는 산출물을 만들지 않고, run은 지금 실행하며, build는 관리형 제품을 만듭니다. 빌드에는 선택한 대상의 호스트 도구가 필요할 수 있습니다.

매뉴얼: CLI와 진단

더 나아갈 경로

아래 형식은 일상 문법에 익숙해진 뒤 필요에 따라 배우면 됩니다. 기본 카드보다 의도적으로 덜 두드러지게 배치했습니다. 애플리케이션에 필요한 갈래만 선택하세요.

  • 파이프라인 — 왼쪽에서 오른쪽으로 흐르는 값을 파이프라인과 플레이스홀더에서 따라가세요.
  • 컴프리헨션 — 중첩된 선택으로 컬렉션을 만드는 법은 컬렉션과 컴프리헨션에 있습니다.
  • 프로토콜 — 명목 선언과 정적 적합 관계는 레코드와 명목 데이터에서 설명합니다.
  • 제네릭 — 보통 함수만으로 부족할 때 단일 랭크 타입 매개변수를 쓰는 법은 함수와 제네릭에 있습니다.
  • 동시성 — 제한된 작업을 합치고 시간 초과 결과를 고르는 법은 동시성을 참고하세요.
  • 파일과 리소스 — 명시적인 호스트 경계를 건너는 방법은 파일과 리소스에 있습니다.
  • 웹과 서비스 제품 — 브라우저, 오프라인, 제한형 서버 경로는 애플리케이션 루프에서 선택하세요.
  • 바이트와 미디어 — 불변 Bytes, 가변 ByteBuffer, 해시, 코덱은 코어 라이브러리에서 다룹니다.

이 페이지는 번호가 붙지 않는 참고 자료입니다. 개념과 연습 문제를 차례대로 익히고 첫 애플리케이션까지 완성하려면 학습 경로로 돌아가세요.