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

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

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

Эта страница описывает Топаз v5.17. Прежде чем считать её актуальной, сверьте поле version в /version.json со значением 5.17.

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

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

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

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

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

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

TOPAZ
const МИНУТЫ_ПО_УМОЛЧАНИЮ = 25
let название: string = "Check program"
let mut завершено: int = 0
завершено = завершено + 1

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

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

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

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

TOPAZ
function удвоить(значение: int) -> int {
    значение * 2
}

let увеличить: (int) -> int = значение => значение + 1
print("{удвоить(увеличить(3))}")

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

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

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

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

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

TOPAZ
let итого = {
    let основа = 20
    основа + 5
}
print("{итого}")

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

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

if, match и for

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

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

TOPAZ
let оценки = [92, 74]
let метки = for оценка in оценки {
    match оценка {
        case 90..100 => "A"
        case _ => if оценка >= 70 {
            "pass"
        } else {
            "retry"
        }
    }
}

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

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

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

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

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

TOPAZ
let оценки: Array<int> = [80, 90]
let идентификаторы = set { 3, 1, 3 }
let метки = map { 1: "one", 2: "two" }

print("{оценки}:{идентификаторы.toArray()}:{метки.keys}")

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

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

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

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

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

TOPAZ
record Задача {
    название: string,
    выполнена: bool = false,
}

enum Фильтр {
    Все,
    Открытые,
}

type Выбор = Задача | null
let выбранная: Выбор = null

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

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

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

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

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

TOPAZ
function прочитатьПлан(путь: string) -> Result<string, string> {
    let файл = open(путь)?
    defer { файл.close() }

    файл.read()
}

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

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

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

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

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

TOPAZ
let имя = "Topaz"
let приветствие = "Hello, {имя}!"
let путь = p"notes/{имя}.txt"

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

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

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

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

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

Предположим, что src/plan.tpz экспортирует УчебнаяЗадача и подвестиИтог:

TOPAZ
import src.plan { УчебнаяЗадача, подвестиИтог }

export function итог(задачи: Array<УчебнаяЗадача>) -> string {
    подвестиИтог(задачи)
}

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

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

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

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

Форма: 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, хеши и кодеки описаны в разделе Базовая библиотека.

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