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

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

Находите нужный синтаксис Топаза, смотрите результаты примеров и переходите к подробным правилам.

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

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

Просмотрите основные формы записи или откройте нужную карточку. Карточки модулей и команд проекта ссылаются на инструкции по созданию необходимых файлов.

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

Дайте значениям имена и выберите, каким именам можно присваивать новое значение.

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

завершено получает значение 1. Для const значение должно быть известно во время проверки. let связывает имя со значением без повторного присваивания, а let mut разрешает его. Укажите тип через : Тип или позвольте средству проверки вывести его.

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

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

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

Повторно используйте вычисление в именованной функции или передайте короткую функцию как значение.

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

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

Программа печатает 8. В увеличить хранится лямбда, короткая функция без имени. Функция удвоить объявляет типы входа и результата и возвращает последнее выражение. Можно также использовать return.

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

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

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

Получите результат блока из его последнего выражения.

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

Программа печатает 25. Блоки, if, match и for в позиции значения могут возвращать результат. Присваивание является инструкцией и не может служить последним результатом.

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

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

if, match и for

Выберите ветвь с помощью if или match и соберите результаты с помощью for.

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

метки содержит ["A", "pass"]. Выражение for собирает по одному результату для каждой оценки в Array<string>. if проверяет логическое условие, а match выбирает ветвь по образцам.

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

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

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

Храните значения по порядку, находите их по ключу или убирайте повторы.

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

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

Программа печатает [80, 90]:[3, 1]:[1, 2]. Array<T> хранит значения в порядке индексов. Map<K, V> находит значения по ключу, а Set<T> хранит каждое значение один раз. Отображения и множества сохраняют порядок вставки. Повторение ключа в литерале отображения вызывает ошибку.

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

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

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

Объедините поля в запись, перечислите варианты или соедините типы в объединение.

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

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

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

выбранная имеет значение null, поэтому задача отсутствует. Задача объединяет именованные поля, Фильтр перечисляет варианты, а Задача | null допускает оба типа. Записи и перечисления имеют номинальные типы. Отдельные объявления задают разные типы, даже если их поля совпадают.

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

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

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

Верните ошибку вызывающему коду и закройте открытый файл при выходе из функции.

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

    файл.read()
}

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

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

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

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

Вставьте значения в строку или сохраните путь в виде шаблона.

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

приветствие содержит "Hello, Topaz!". Тег p создаёт шаблон пути. Другие встроенные теги включают r для регулярных выражений, sh для команд оболочки и sql для параметризованного SQL. Создание шаблона не выполняет соответствующую операцию среды. Шаблоны в обратных кавычках, интерполяция с долларом и фигурными скобками, HTML-теги и пользовательские теги не поддерживаются.

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

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

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

Импортируйте объявления из другого файла. Этот фрагмент предполагает, что src/plan.tpz экспортирует УчебнаяЗадача и подвестиИтог. Создайте полные файлы по разделу Первое приложение.

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

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

Каждый файл .tpz является модулем. Размещайте импорты в начале файла. Путь с точками начинается от корня компиляции, поэтому src.plan указывает на src/plan.tpz. Другие модули могут импортировать объявления с export. Этот импорт открывает два указанных объявления, а закрытые объявления остаются недоступными.

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

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

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

Используйте эти команды при работе с пакетом. Примеры предполагают наличие манифеста пакета, файла блокировки и tests/plan.tpz в рабочей папке. Создайте их по разделу Первое приложение.

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

fmt --check сообщает об отличиях форматирования, не меняя файлы. check сообщает об ошибках исходного кода без запуска. test показывает результаты тестов, а run выводит результат программы. build записывает нативный исполняемый файл и вспомогательные файлы в папку build. Нативная сборка требует Rust и Cargo для вашей платформы. При успехе каждая команда завершается с кодом 0. Ожидаемый вывод приведён в связанном уроке.

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

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

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

Выберите тему, которая нужна вашей программе.

Чтобы собрать первое приложение шаг за шагом, вернитесь к учебному маршруту. Сначала изучите значения и функции, данные и управление потоком, затем ошибки и ресурсы, а после переходите к первому приложению.