토파즈 배우기

문법 한눈에 보기

자주 사용하는 토파즈 문법을 10분 안에 살펴봅니다. 각 구문의 세부 규칙을 다루는 매뉴얼 페이지를 함께 안내합니다.

이 페이지는 강좌나 요약 명세가 아닌 문법 가이드입니다. 카드마다 실용적인 유스케이스 하나를 다룹니다. 정본 구문을 제시한 뒤 세부 규칙을 다루는 매뉴얼 페이지로 안내합니다. 토파즈 프로그램을 처음 작성한다면 학습 경로에서 시작하고 이 페이지는 참고용으로 곁에 두세요.

일상적으로 쓰는 문법

언어의 전체 구조를 빠르게 파악하려면 카드를 순서대로 읽으세요. 찾으려는 구문이 정해져 있다면 해당 카드로 바로 이동하세요. 예제는 의도적으로 간결하게 구성했습니다. 완전한 프로그램과 선언은 그 자체로 동작합니다. 모듈 카드는 전제하는 파일 경로를 명확히 밝힙니다.

값, 바인딩, 타입

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

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

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

매뉴얼: 타입

함수와 람다

이름 있는 함수는 재사용할 로직에 매개변수와 반환 타입을 명확히 명시합니다. 람다는 이름을 붙이지 않는 간결한 구문으로, 로직을 값으로 전달할 때 사용합니다. 함수 본문에서 return을 사용할 수도 있고, 마지막 표현식을 바로 반환값으로 삼을 수도 있습니다.

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

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

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

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

매뉴얼: 함수와 제네릭

연산자와 표현식의 결과

연산자는 값을 결합합니다. 블록, if, match, 값을 생성하는 위치에 놓인 for 역시 저마다 결과를 낼 수 있습니다. 블록의 마지막 표현식에는 대입이나 별도의 반환 표시를 붙이지 않습니다. 해당 표현식 자체가 블록의 평가 결과가 됩니다.

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

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

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

매뉴얼: 연산자와 표현식

if, match, for

불리언 조건에 따라 분기할 때는 if, 값의 구조나 조건 케이스에 따라 분기할 때는 match, 값을 정해진 순서로 순회할 때는 for를 사용합니다. 아래 for는 값을 생성하는 위치에 놓여 있습니다. 따라서 각 점수의 결과 하나를 수집해 Array<string>을 만듭니다.

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

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

등급들["A", "pass"]입니다.

매뉴얼: 패턴과 제어 흐름

배열, 맵, 셋

순서가 있는 값의 집합은 Array<T>, 키로 값을 찾을 때는 Map<K, V>, 중복 없는 값의 집합은 Set<T>를 선택합니다. 배열은 인덱스 순서를 따르며, 맵과 셋은 요소를 넣은 순서를 유지합니다.

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

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

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

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

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

레코드, 열거형, 유니온

record는 필드로 구성된 곱 타입에 이름을 붙입니다. enum은 닫힌 선택지 집합에 이름을 붙입니다. |로 표기하는 유니온은 특정 값이 나열된 타입 중 하나일 수 있음을 나타냅니다. 외부 데이터의 값 없음을 표현하는 경계에서는 null을 포함할 수 있습니다.

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

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

enum 필터 {
    전체,
    열림,
}

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

레코드와 열거형은 명목 타입입니다. 외형 구조뿐만 아니라 선언된 이름도 함께 기준으로 타입 판별을 수행합니다.

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

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

예상 가능한 값의 부재는 Option<T>, 호출자가 처리할 수 있는 실패는 Result<T, E>로 표현합니다. 후위 ?Ok의 값을 추출합니다. Err인 경우 동일한 오류를 즉시 반환합니다. defer는 정리 작업을 어휘 스코프에 바인딩합니다. fault는 키워드나 값이 아닌 실행 중단 경계입니다. 따라서 ?로 잡을 수 없습니다.

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

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

    파일.read()
}

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

매뉴얼: Null·Option·결과·fault

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

큰따옴표 문자열은 {표현식}으로 값을 보간합니다. 고정 레지스트리 태그 p, r, sh, sql은 경로, 정규식, 셸 명령, 매개변수화된 SQL에 필요한 데이터 구조를 보존합니다. 태그가 붙은 값을 생성하더라도 호스트 동작이 자동으로 실행되지는 않습니다.

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

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

백틱 템플릿, 달러·중괄호 보간, HTML 태그, 사용자 정의 태그는 현재 토파즈 문법에서 지원하지 않습니다.

매뉴얼: 문자열과 템플릿

모듈과 가시성

.tpz 파일 하나가 단일 모듈을 구성합니다. 점으로 구분한 모듈 경로는 컴파일 루트를 기준으로 해석합니다. 가져오기는 파일 상단에 모아서 작성합니다. export로 명시한 선언만 외부 모듈에 노출됩니다.

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

src/plan.tpz학습과제요약을 공개한다고 가정합니다.

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

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

선택적 가져오기는 지정한 선언만 노출합니다. 모듈 내부의 비공개 심볼까지 노출하지는 않습니다.

매뉴얼: 모듈과 가시성

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

툴체인은 작성부터 배포까지 동일한 소스 및 모듈 모델을 공유합니다. 먼저 코드 포맷을 맞추고 정적 검사를 통과시키세요. 그다음 테스트를 실행하세요. 인터프리터로 동작을 확인한 후, 실제 배포 타깃만 빌드하세요.

형식: 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, 해시, 코덱은 코어 라이브러리에서 다룹니다.

이 페이지는 순서가 고정되지 않은 참조 문서입니다. 핵심 개념과 실습 과제를 차례대로 익히고 첫 애플리케이션을 완성하려면 학습 경로로 돌아가세요.