Изучение Топаза

Краткий обзор синтаксиса

Десятиминутная карта повседневного синтаксиса Топаза со ссылкой на точный раздел руководства для каждой формы.

Это карта, а не учебный курс и не сокращённая спецификация. Каждая карточка отвечает на один практический вопрос, показывает каноническую форму и ведёт в тот раздел руководства, где описаны подробности. Если вы пишете первую программу на Топазе, начните с учебного маршрута, а эту страницу держите под рукой как справочник.

Повседневный набор

Просмотрите карточки по порядку, чтобы увидеть язык целиком, или сразу откройте нужную форму. Примеры намеренно невелики: законченные программы и объявления самостоятельны, а карточка модулей явно называет единственный файл, который она предполагает.

Значения, связывания и типы

Значения — данные, с которыми работает программа. Используйте const, если значение должно быть известно во время проверки, let для неизменяемого локального значения и let mut, когда повторное присваивание отражает модель задачи. Аннотация : Тип делает контракт явным; без неё Топаз выводит тип.

Форма: let имя: Тип = выражение

TOPAZ
const DEFAULT_MINUTES = 25
let title: string = "Check program"
let mut completed: int = 0
completed = completed + 1

Руководство: Типы

Функции и лямбды

Именованная функция задаёт явный контракт параметров и результата для повторно используемого поведения. Лямбда — короткая анонимная форма, когда поведение нужно передать как значение. Функция может использовать return либо вернуть последнее выражение тела.

Форма: function имя(значение: Тип) -> Результат { выражение }, значение => выражение

TOPAZ
function double(x: int) -> int {
    x * 2
}

let increment: (int) -> int = x => x + 1
print("{double(increment(3))}")

Программа печатает 8.

Руководство: Функции и обобщения

Операторы и результаты выражений

Операторы соединяют значения, а блоки, if, match и for в позиции значения могут сами давать результат. Последнее выражение блока не требует присваивания или особой отметки возврата: оно и есть результат блока.

Форма: { инструкции; последнееВыражение }

TOPAZ
let total = {
    let base = 20
    base + 5
}
print("{total}")

Программа печатает 25. Присваивание — инструкция, а не выражение.

Руководство: Операторы и выражения

if, match и for

Используйте if для выбора по логическому условию, match — когда важна форма или вариант значения, а for — чтобы обойти значения в определённом порядке. Здесь for находится в позиции значения и собирает по одному результату для каждой оценки в Array<string>.

Форма: if условие { значение } else { значение }, match значение { case образец => значение }, for элемент in значения { значение }

TOPAZ
let scores = [92, 74]
let labels = for score in scores {
    match score {
        case 90..100 => "A"
        case _ => if score >= 70 {
            "pass"
        } else {
            "retry"
        }
    }
}

Значение labels равно ["A", "pass"].

Руководство: Шаблоны и управление потоком

Массивы, отображения и множества

Выбирайте Array<T> для упорядоченных значений, Map<K, V> для поиска значения по ключу и Set<T> для уникальных значений. У массива порядок позиционный; отображения и множества сохраняют заданный порядок вставки.

Форма: [a, b], map { ключ: значение }, set { a, b }

TOPAZ
let scores: Array<int> = [80, 90]
let ids = set { 3, 1, 3 }
let labels = map { 1: "one", 2: "two" }

print("{scores}:{ids.toArray()}:{labels.keys}")

Повторная 3 занимает в множестве одно место. Ключ в литерале отображения указывают только один раз.

Руководство: Коллекции и включения

Записи, перечисления и объединения

record даёт имя произведению полей. enum даёт имя закрытому набору вариантов. Объединение с | означает, что значение может иметь любой из перечисленных типов; добавление null удобно на границе с данными, где значение может отсутствовать.

Форма: record Имя { поля }, enum Имя { варианты }, type Выбор = A | B

TOPAZ
record Task {
    title: string,
    done: bool = false,
}

enum Filter {
    All,
    Open,
}

type Selection = Task | null
let selected: Selection = null

Записи и перечисления номинальны: важна не только видимая форма, но и объявленная сущность.

Руководство: Записи и номинальные данные

Отсутствие, восстанавливаемая ошибка, сбой и очистка

Для ожидаемого отсутствия используйте Option<T>, а для ошибки, которую может обработать вызывающий код, — Result<T, E>. Постфиксный ? извлекает Ok либо сразу возвращает тот же Err. defer связывает очистку с лексической областью. Fault — не ключевое слово и не значение: он прекращает вычисление, и ? его не перехватывает.

Форма: Some(значение) / None, Ok(значение) / Err(ошибка), результат?, defer { очистка }

TOPAZ
function readPlan(path: string) -> Result<string, string> {
    let file = open(path)?
    defer { file.close() }

    file.read()
}

Ошибка открытия или чтения остаётся в Result; недопустимый индекс массива, напротив, вызывает сбой времени выполнения.

Руководство: Null, Option, Result и ошибки

Строки и шаблоны из реестра

В строку с двойными кавычками значение подставляется как {выражение}. Фиксированные теги реестра p, r, sh и sql сохраняют дополнительную структуру пути, регулярного выражения, команды оболочки или параметризованного SQL. Само создание такого значения не запускает действие на хосте.

Форма: "текст {значение}", тег"текст {значение}"

TOPAZ
let name = "Topaz"
let greeting = "Hello, {name}!"
let path = p"notes/{name}.txt"

Шаблоны в обратных кавычках, интерполяция с долларом и фигурными скобками, HTML-теги и пользовательские теги не входят в текущий синтаксис Топаза.

Руководство: Строки и шаблоны

Модули и видимость

Каждый файл .tpz является одним модулем. Путь с точками отсчитывается от корня компиляции. Импорты образуют пролог файла, а другому модулю видны только объявления с export.

Форма: import путь.модуля { Имя }, export function имя(...)

Предположим, что src/plan.tpz экспортирует StudyTask и summarize:

TOPAZ
import src.plan { StudyTask, summarize }

export function summary(tasks: Array<StudyTask>) -> string {
    summarize(tasks)
}

Выборочный импорт открывает только названные объявления, но не закрытые имена модуля.

Руководство: Модули и видимость

Форматирование, проверка, тест, запуск и сборка

Инструментарий применяет одну модель исходников и модулей от редактирования до поставки. Сначала проверьте форматирование и статическую корректность, затем запустите тесты, посмотрите поведение в интерпретаторе и соберите только тот продукт, который собираетесь распространять.

Форма: topaz <задача> [входы]

BASH
topaz fmt --check --root .
topaz check --root . --locked
topaz test tests/plan.tpz --root . --locked
topaz run --root . --locked
topaz build --target python --root . --locked --out-dir build

check не создаёт артефакт, run выполняет программу сразу, а build создаёт управляемый продукт и может потребовать инструменты хоста для выбранной цели.

Руководство: CLI и диагностика

Следующие направления

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

  • Конвейеры — проследите поток значения слева направо в разделе Конвейеры и заполнители.
  • Включения — создавайте коллекции с вложенным отбором в разделе Коллекции и включения.
  • Протоколы — статическое соответствие рядом с номинальными объявлениями описано в разделе Записи и номинальные данные.
  • Обобщения — добавляйте параметр типа первого ранга, когда обычной функции недостаточно: Функции и обобщения.
  • Конкурентность — объединяйте ограниченную работу и выбирайте результат тайм-аута в разделе Конкурентность.
  • Файлы и ресурсы — переходите явную границу хоста по правилам раздела Файлы и ресурсы.
  • Веб- и сервисные продукты — выберите браузерный, автономный или ограниченный серверный путь в разделе Цикл приложения.
  • Байты и медиа — неизменяемые Bytes, изменяемый ByteBuffer, хеши и кодеки описаны в разделе Базовая библиотека.

Эта страница остаётся ненумерованным справочником. Вернитесь к учебному маршруту, если хотите пройти понятия и упражнения по порядку и собрать первое полноценное приложение.