토파즈 소개

토파즈 코드를 예제로 살펴보고 시작할 곳을 고릅니다.

토파즈는 조판에 특화된 프로그래밍 언어입니다. 책부터 보고서와 청구서까지 인쇄용 문서를 만드는 프로그램에 쓰고, 명령줄 도구, 데이터 변환, 애플리케이션 로직도 작성할 수 있습니다. 작고 일관된 문법과 내 언어로 짓는 이름을 쓰고, 컴퓨터나 브라우저에서 프로그램을 실행하고 싶을 때 선택하세요.

첫 프로그램을 실행하거나 학습 경로를 따라가세요. 설치 없이 써 보려면 플레이그라운드를 여세요. 문법을 찾을 때는 문법 한눈에 보기를 곁에 두세요.

업무에서 쓰는 말로 이름 짓기

한 프로그램에서 한국어·러시아어·영어 이름을 함께 쓸 수 있습니다.

TOPAZ
function 인사(이름: string, 언어: string) -> string {
    return match 언어 {
        case "한국어" => "안녕하세요, {이름}님!"
        case "Русский" => "Привет, {이름}!"
        case _ => "Hello, {이름}!"
    }
}

let 사용자 = "김토파즈"
print(인사(사용자, "한국어"))
print(인사("Topaz", "Русский"))
출력
안녕하세요, 김토파즈님!
Привет, Topaz!

사용자는 이름처럼 변수에 붙인 이름입니다. 토파즈는 입력한 문자를 그대로 유지합니다. 같은 문자를 쓴 이름끼리 일치하며, 모듈을 찾을 때 혼동할 수 있는 이름은 컴파일러가 거절합니다.

오류 처리와 정리 작업

이 예제는 포트 번호나 오류를 반환하고, 두 경우 모두 정리 코드를 실행합니다.

TOPAZ
function 포트해석(원문: string) -> Result<int, string> {
    let 번호 = toInt(원문) ?? -1
    if 번호 < 1 {
        return Err("not a port: {원문}")
    }
    return Ok(번호)
}

function 시작(원문: string) -> Result<string, string> {
    defer print("config closed")
    let 포트 = 포트해석(원문)?
    return Ok("listening on {포트}")
}

print("{시작("8080")}")
print("{시작("http")}")
출력
config closed
Ok(listening on 8080)
config closed
Err(not a port: http)

Result는 성공을 Ok, 처리할 수 있는 오류를 Err로 표현합니다. ?는 Err를 호출자에게 돌려줍니다. defer는 중간에 반환해도 스코프를 나갈 때 정리 코드를 실행하므로 두 호출 모두 config closed를 출력합니다. 값이 없을 수 있을 때는 Some과 None을 갖는 Option을 씁니다. 개발자와 코드 생성 도구 모두 이 규칙을 따릅니다.

SQL 원문과 값 구분하기

이 예제는 원문과 삽입할 값 두 개를 담은 SQL 템플릿을 만듭니다.

TOPAZ
let 표 = "users"
let 질의 = sql"select * from {표} where active = {true}"
print("{질의}")
출력
<sql template, 3 part(s), 2 interpolation(s)>

출력은 원문 조각 세 개와 삽입할 값 두 개가 있음을 보여 줍니다. 템플릿은 나중에 쓸 수 있도록 둘을 구분해 보관합니다. 경로에는 p, 정규식에는 r, 셸 명령에는 sh 템플릿도 쓸 수 있습니다. 템플릿을 만드는 것만으로 질의나 명령을 실행하지는 않습니다.

실행 전에 오류 찾기

이 함수는 신호등 색 세 가지 중 하나를 받아 다음 색을 반환합니다.

TOPAZ
type 신호등 = "red" | "yellow" | "green"

function 다음신호(신호: 신호등) -> 신호등 {
    return match 신호 {
        case "red" => "green"
        case "green" => "yellow"
        case _ => "red"
    }
}

컴파일러는 실행 전에 타입과 이름을 확인하고 match에서 빠뜨린 경우를 알립니다. 이를 정적 검사라고 합니다. 프로그램이 의도한 논리를 구현했는지는 판단하지 못합니다. 위 타입은 세 색을 모두 허용하므로 색이 올바른 순서로 바뀌는지는 테스트로 확인해야 합니다. 함수 정의만 실행하면 출력은 없습니다.

프로그램 실행 방식 고르기

topaz run은 파일을 검사한 뒤 실행합니다. topaz build는 같은 소스에서 네이티브 실행 파일이나 브라우저용 패키지를 만듭니다. 네이티브 빌드에는 별도의 빌드 도구가 필요합니다. 필요한 파일과 설치 과정, 결과는 첫 애플리케이션에서 따라 해 보세요.

설치해서 쓰는 컴파일러는 토파즈로 작성했습니다. 자기 소스를 컴파일할 수 있고, 반복해서 컴파일해도 같은 코드를 생성합니다. 컴파일 단계와 지원 대상, 설치 정보는 툴체인 상태에서 확인하세요.

메모리 소유권과 수명을 직접 제어하거나 임베디드 하드웨어를 다룬다면 Rust, C, Zig 같은 시스템 언어를 고려하세요. 명령줄 도구와 애플리케이션 로직을 작성하려면 학습 경로로 이어가세요.

설계 이유는 언어 철학에서 설명합니다. 토파즈 소스는 topaz.ooo/dl에서 볼 수 있습니다.