Знакомство с Топазом

Посмотрите на код Топаза в примерах и выберите, с чего начать.

Язык программирования Топаз создан специально для вёрстки текста. На нём пишут программы, которые готовят к печати документы от книг до отчётов и счетов, а также утилиты командной строки, обработку данных и логику приложений. Он подходит, если вам нужны компактный единообразный синтаксис, имена на родном языке и запуск на компьютере или в браузере. На странице Программы на Топазе можно познакомиться с работающими продуктами и прочитать их исходный код.

Напишите первую программу, пройдите учебный маршрут или откройте песочницу, чтобы попробовать язык без установки. Держите Краткий обзор синтаксиса под рукой для поиска нужной записи.

Называйте данные привычными словами

В одной программе можно использовать корейские, русские и английские имена.

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. Для значения, которое может отсутствовать, используйте Option с вариантами Some и None. Разработчики и генераторы кода следуют этим же правилам.

Храните текст 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.