Topazdocs
개요

토파즈 소개

토파즈는 애플리케이션 의도를 위한 작고 닫힌 언어입니다. 모든 것을 말하는 하나의 정형으로, 사람과 에이전트가 쓰고 툴체인이 검사합니다.

버전 안내: 이 문서는 Topaz v5.2 정식 문법을 따릅니다. v5.2는 동결된 v5.1의 엄격 상위집합입니다. 모듈은 v5.2의 새 기능입니다: 모듈과 가시성 참고.

토파즈는 애플리케이션 의도를 위한 작고 닫힌 언어입니다. 모든 것을 말하는 방법은 하나이고, 사람과 에이전트가 쓰며, 툴체인이 검사합니다. Python이나 TypeScript처럼 읽히지만 표면은 의도적으로 닫혀 있습니다: 의도마다 정확히 하나의 정형이 있고, v5.2 명세에 잠겨 있습니다. 누구를 위한 언어이고 누구를 위한 언어가 아닌지는 왜 토파즈인가?에서 다룹니다.

이 페이지에서 출력을 보여주는 모든 프로그램은 사이트 검증기가 v5.2 툴체인에서 실행합니다. 각 출력 블록은 캡처된 실행 결과와 바이트 단위로 일치해야 하고, 나머지 펜스는 파스 검증됩니다.

Lena Code 인터롭. 토파즈는 Lena Code 변환 워크플로가 다루는 언어 중 하나입니다. Lena Code의 핵심 표면이나 중간 언어가 아니라, 독립 언어로서 CSKernel™ 구현·검증 일부의 엔지니어링 언어로 쓰입니다.

첫 번째 증명: Unicode-first

식별자는 렉서부터 Unicode입니다. 한글은 1등 시민이고, 도메인 단어가 로마자 근사어가 되지 않고 그대로 코드가 됩니다:

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

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

사용자는 평범한 변수입니다. Unicode 정체성은 용인되는 엣지 케이스가 아닙니다: 식별자는 작성한 스칼라 시퀀스 그대로이고 조용한 정규화는 없습니다(§1). 모듈 리졸버는 exact·NFC/NFD·case-fold 충돌 키로 파일 간 닮은꼴 모듈 이름을 거부합니다(§17).

네 개의 기둥

작고 닫힌 표면

의도마다 쓰는 방법은 하나입니다. 정책은 언어가 결정합니다: 복구 가능한 실패는 Result, 부재는 옵셔널, 정리는 defer. 그래서 사람도 에이전트도 파일마다 다시 결정하지 않습니다:

TOPAZ
function parsePort(raw: string) -> Result<int, string> {
    let n = toInt(raw) ?? -1
    if n < 1 {
        return Err("not a port: {raw}")
    }
    return Ok(n)
}

function startup(raw: string) -> Result<string, string> {
    defer print("config closed")
    let port = parsePort(raw)?
    return Ok("listening on {port}")
}

print("{startup("8080")}")
print("{startup("http")}")
OUTPUT
config closed
Ok(listening on 8080)
config closed
Err(not a port: http)

? 연산자는 Err를 전파하고, defer는 모든 종료 경로에서 실행됩니다. 그래서 위 트랜스크립트에 config closed가 두 번 나타납니다.

Unicode-first 정체성

위에서 증명했습니다. 문자열은 암묵 정규화가 없는 Unicode 스칼라 시퀀스이고, 작성한 그대로가 동등 비교의 기준입니다(§1). grapheme 클러스터 API는 미래 v5 결정으로 유예되어 있습니다(§20, §22).

에이전트 시대의 설계

에이전트가 통째로 들고 있을 수 있을 만큼 작은 명세, 기계 검사 가능한 프로파일, 그리고 스스로 검증되는 문서: 이 사이트의 모든 정식 펜스는 툴체인으로 파스 검증되고, 실행 가능한 예제는 출력이 고정된 채 실행됩니다. 이 사이트의 검증 방법을 참고하세요.

의도를 담는 템플릿

sql, sh, path 문자열은 템플릿입니다. 문자열로 붕괴하지 않고 파트와 보간을 분리한 채 유지하는 구조화된 값입니다:

TOPAZ
let table = "users"
let q = sql"select * from {table} where active = {true}"
print("{q}")
OUTPUT
<sql template, 3 part(s), 2 interpolation(s)>

저 플레이스홀더 렌더링이 지금의 정직한 현재입니다: 템플릿 값은 존재하고 아무것도 이어붙여지지 않았으며, 도메인별 렌더링 정책(인용, 이스케이프)은 미래 v5 결정으로 유예되어 있습니다. 안전은 규율이 아니라 문법으로 남습니다.

타입 규율, 정직하게

토파즈는 명세상 정적 타입 언어입니다. 어노테이션, 추론, 리터럴 타입 모두 잠긴 v5.2 표면의 일부입니다:

TOPAZ
type TrafficLight = "red" | "yellow" | "green"

function next(light: TrafficLight) -> TrafficLight {
    return match light {
        case "red" => "green"
        case "green" => "yellow"
        case _ => "red"
    }
}

정적 체커는 v5.2에서 배포됩니다: topaz check가 기본으로 컴파일 유닛 전체를 타이핑합니다. 인터프리터가 한때 런타임 동적 가드(TPZ5xxx)로만 강제하던 계약이 이제 정적 진단으로 승격되어, 프로그램이 실행되기 전에 잡힙니다. 상태 페이지가 툴체인 게이트를 추적합니다.

오늘 동작하는 것

Topaz v5.2는 끝까지 동작합니다: Unicode-first 렉서, 전체 파서, 멀티 파일 모듈 리졸버; 유닛 전체 정적 타입 체커(topaz check); topaz run 뒤의 기준 인터프리터(패턴 매칭, defer, concurrent, 소스 캐럿과 함께 렌더링되는 폴트까지); 그리고 프로그램을 자체 완결 네이티브 바이너리로 낮추는 Rust 방출 백엔드(topaz emit / topaz build). 이 백엔드는 인터프리터와 차등 테스트되어 둘이 구조적으로 일치합니다. 이 사이트는 툴체인 상태에 개수와 게이트를 공개합니다.

첫 프로그램은 시작하기에서 볼 수 있습니다. 그곳의 모든 트랜스크립트는 실제 툴체인에서 캡처한 것입니다.

앞으로의 길

언어 표면은 v5.2에서 잠겨 있습니다; 아래는 빠진 게 아니라 의도적으로 유예된 것입니다:

  • 그래핌 클러스터 API도메인별 템플릿 렌더링(인용/이스케이프 정책) — 미래 v5 결정 (§20, §22).
  • 최적화 낮추기 — Rust 백엔드는 오늘 정확성 우선이며, 타입 기반/단형 낮추기는 후속 기록입니다.

이 페이지는 라벨 너머의 어떤 것도 약속하지 않습니다. 진실의 원천은 상태 페이지입니다.

여기서 시작하세요

말하는 방법은 하나.