Один способсказать.

Компактный язык для выражения замысла приложений с единообразным и понятным синтаксисом.

Запустите программу сейчас и получите показанный результат.

TOPAZ
function clean(words: Array<string>) -> Array<string> {
    return filter(words, (w: string) => w != "")
}

function shout(words: Array<string>) -> Array<string> {
    return map(words, (w: string) => w + "!")
}

let line = ["one", "", "way", "", "to", "say", "it"]
    |> clean
    |> shout
print("{line}")
вывод
[one!, way!, to!, say!, it!]

Четыре продукта, один исходник

Запустите файл сразу после того, как написали его. Из того же файла собирается нативный бинарный файл, пакет Python или веб-пакет, а нужный вариант выбирается флагом одной команды.

Одна закреплённая форма

У каждого типового решения одна каноническая запись, и язык держит эту линию. Файл, написанный человеком, и файл, написанный генератором кода, получаются одинаковой формы.

У отказа есть форма

Восстановимый отказ идёт через Result, ожидаемое отсутствие значения идёт через Option. Очистка выполняется на каждом пути выхода, а проверка типов называет случай, пропущенный в match.

Ваши слова становятся именами

Идентификаторы представлены в Unicode начиная с лексера, и введённое имя не переписывается за вашей спиной. Переменная 사용자 работает как любая другая, а резолвер модулей отклоняет имена, которые вводят в заблуждение.

Компактность по замыслу

Поверхность языка остаётся компактной, потому что компактная поверхность и есть продукт. Человек читает ту же грамматику, которую пишет генератор кода.

Исполняемая спецификация

Спецификация для людей и код для компьютеров.

Топаз — компактный язык для выражения замысла приложений с приоритетом Unicode. Люди и генераторы кода используют одинаковый синтаксис, а программы можно выполнять напрямую или компилировать в Rust, Python и web-форматы.

Читать философию →

Код говорит сам за себя.

TOPAZ
function discount(customer: { tier: string, years: int }) -> float {
    return match customer {
        case { tier: "vip", years } if years > 5 => 0.3
        case { tier: "vip" } => 0.2
        case { years } if years > 1 => 0.1
        case _ => 0.0
    }
}

print("{discount({ tier: "vip", years: 7 })}")
print("{discount({ tier: "new", years: 0 })}")
вывод
0.3
0.0
TOPAZ
let result = concurrent {
    answer: 6 * 7
    status: "ready"
}

defer print("cleaned up")
print("{result.answer} {result.status}")
вывод
42 ready
cleaned up
TOPAZ
function fibonacci(n: int) -> int {
    return match n {
        case 0 => 0
        case 1 => 1
        case _ => fibonacci(n - 1) + fibonacci(n - 2)
    }
}

let series = map(0..<10, fibonacci)
print("{series}")
вывод
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
TOPAZ
function clean(words: Array<string>) -> Array<string> {
    return filter(words, (w: string) => w != "")
}

function shout(words: Array<string>) -> Array<string> {
    return map(words, (w: string) => w + "!")
}

let line = ["one", "", "way", "", "to", "say", "it"]
    |> clean
    |> shout
print("{line}")
вывод
[one!, way!, to!, say!, it!]

Любой язык. Один и тот же код.

한국어

TOPAZ
function 인사하기(이름: string) -> string {
    return "안녕하세요, {이름}님!"
}

print(인사하기("토파즈"))
вывод
안녕하세요, 토파즈님!

English

TOPAZ
function greet(name: string) -> string {
    return "Hello, {name}!"
}

print(greet("Topaz"))
вывод
Hello, Topaz!

Русский

TOPAZ
function привет(имя: string) -> string {
    return "Привет, {имя}!"
}

print(привет("Топаз"))
вывод
Привет, Топаз!

Замысел пишете вы. Компилятор выдаёт Rust и Python.

Что делает инструментарий сегодня →