Это карта, а не учебный курс и не сокращённая спецификация. Каждая карточка отвечает на один практический вопрос, показывает каноническую форму и ведёт в тот раздел руководства, где описаны подробности. Если вы пишете первую программу на Топазе, начните с учебного маршрута, а эту страницу держите под рукой как справочник.
Повседневный набор
Просмотрите карточки по порядку, чтобы увидеть язык целиком, или сразу откройте нужную форму. Примеры намеренно невелики: законченные программы и объявления самостоятельны, а карточка модулей явно называет единственный файл, который она предполагает.
Значения, связывания и типы
Значения — данные, с которыми работает программа. Используйте const, если значение должно быть известно во время проверки, let для неизменяемого локального значения и let mut, когда повторное присваивание отражает модель задачи. Аннотация : Тип делает контракт явным; без неё Топаз выводит тип.
Форма: let имя: Тип = выражение
const DEFAULT_MINUTES = 25
let title: string = "Check program"
let mut completed: int = 0
completed = completed + 1Руководство: Типы
Функции и лямбды
Именованная функция задаёт явный контракт параметров и результата для повторно используемого поведения. Лямбда — короткая анонимная форма, когда поведение нужно передать как значение. Функция может использовать return либо вернуть последнее выражение тела.
Форма: function имя(значение: Тип) -> Результат { выражение }, значение => выражение
function double(x: int) -> int {
x * 2
}
let increment: (int) -> int = x => x + 1
print("{double(increment(3))}")Программа печатает 8.
Руководство: Функции и обобщения
Операторы и результаты выражений
Операторы соединяют значения, а блоки, if, match и for в позиции значения могут сами давать результат. Последнее выражение блока не требует присваивания или особой отметки возврата: оно и есть результат блока.
Форма: { инструкции; последнееВыражение }
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 значения { значение }
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 }
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
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 { очистка }
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. Само создание такого значения не запускает действие на хосте.
Форма: "текст {значение}", тег"текст {значение}"
let name = "Topaz"
let greeting = "Hello, {name}!"
let path = p"notes/{name}.txt"Шаблоны в обратных кавычках, интерполяция с долларом и фигурными скобками, HTML-теги и пользовательские теги не входят в текущий синтаксис Топаза.
Руководство: Строки и шаблоны
Модули и видимость
Каждый файл .tpz является одним модулем. Путь с точками отсчитывается от корня компиляции. Импорты образуют пролог файла, а другому модулю видны только объявления с export.
Форма: import путь.модуля { Имя }, export function имя(...)
Предположим, что src/plan.tpz экспортирует StudyTask и summarize:
import src.plan { StudyTask, summarize }
export function summary(tasks: Array<StudyTask>) -> string {
summarize(tasks)
}Выборочный импорт открывает только названные объявления, но не закрытые имена модуля.
Руководство: Модули и видимость
Форматирование, проверка, тест, запуск и сборка
Инструментарий применяет одну модель исходников и модулей от редактирования до поставки. Сначала проверьте форматирование и статическую корректность, затем запустите тесты, посмотрите поведение в интерпретаторе и соберите только тот продукт, который собираетесь распространять.
Форма: topaz <задача> [входы]
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, хеши и кодеки описаны в разделе Базовая библиотека.
Эта страница остаётся ненумерованным справочником. Вернитесь к учебному маршруту, если хотите пройти понятия и упражнения по порядку и собрать первое полноценное приложение.