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

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

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

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

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

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

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.