Найдите здесь пример нужного синтаксиса и перейдите по ссылке на подробные правила. Если вы знакомитесь с Топазом, начните с первой программы и учебного маршрута, а эту страницу держите под рукой как справочник.
Повседневный набор
Просмотрите основные формы записи или откройте нужную карточку. Карточки модулей и команд проекта ссылаются на инструкции по созданию необходимых файлов.
Значения, привязки и типы
Дайте значениям имена и выберите, каким именам можно присваивать новое значение.
const МИНУТЫ_ПО_УМОЛЧАНИЮ = 25
let название: string = "Check program"
let mut завершено: int = 0
завершено = завершено + 1завершено получает значение 1. Для const значение должно быть известно во время проверки. let связывает имя со значением без повторного присваивания, а let mut разрешает его. Укажите тип через : Тип или позвольте средству проверки вывести его.
Форма let имя: Тип = выражение
Руководство Типы
Функции и лямбды
Повторно используйте вычисление в именованной функции или передайте короткую функцию как значение.
function удвоить(значение: int) -> int {
значение * 2
}
let увеличить: (int) -> int = значение => значение + 1
print("{удвоить(увеличить(3))}")Программа печатает 8. В увеличить хранится лямбда, короткая функция без имени. Функция удвоить объявляет типы входа и результата и возвращает последнее выражение. Можно также использовать return.
Форма function имя(значение: Тип) -> Результат { выражение }, значение => выражение
Руководство Функции и обобщения
Операторы и результаты выражений
Получите результат блока из его последнего выражения.
let итого = {
let основа = 20
основа + 5
}
print("{итого}")Программа печатает 25. Блоки, if, match и for в позиции значения могут возвращать результат. Присваивание является инструкцией и не может служить последним результатом.
Форма { инструкции; последнееВыражение }
Руководство Операторы и выражения
if, match и for
Выберите ветвь с помощью if или match и соберите результаты с помощью for.
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 значения { значение }
Руководство Шаблоны и управление потоком
Массивы, отображения и множества
Храните значения по порядку, находите их по ключу или убирайте повторы.
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 }
Руководство Коллекции и включения
Записи, перечисления и объединения
Объедините поля в запись, перечислите варианты или соедините типы в объединение.
record Задача {
название: string,
выполнена: bool = false,
}
enum Фильтр {
Все,
Открытые,
}
type Выбор = Задача | null
let выбранная: Выбор = nullвыбранная имеет значение null, поэтому задача отсутствует. Задача объединяет именованные поля, Фильтр перечисляет варианты, а Задача | null допускает оба типа. Записи и перечисления имеют номинальные типы. Отдельные объявления задают разные типы, даже если их поля совпадают.
Форма record Имя { поля }, enum Имя { варианты }, type Выбор = A | B
Руководство Записи и номинальные данные
Отсутствие, восстанавливаемая ошибка, сбой и очистка
Верните ошибку вызывающему коду и закройте открытый файл при выходе из функции.
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 и ошибки
Строки и шаблоны
Вставьте значения в строку или сохраните путь в виде шаблона.
let имя = "Topaz"
let приветствие = "Hello, {имя}!"
let путь = p"notes/{имя}.txt"приветствие содержит "Hello, Topaz!". Тег p создаёт шаблон пути. Другие встроенные теги включают r для регулярных выражений, sh для команд оболочки и sql для параметризованного SQL. Создание шаблона не выполняет соответствующую операцию среды. Шаблоны в обратных кавычках, интерполяция с долларом и фигурными скобками, HTML-теги и пользовательские теги не поддерживаются.
Форма "текст {значение}", тег"текст {значение}"
Руководство Строки и шаблоны
Модули и видимость
Импортируйте объявления из другого файла. Этот фрагмент предполагает, что src/plan.tpz экспортирует УчебнаяЗадача и подвестиИтог. Создайте полные файлы по разделу Первое приложение.
import src.plan { УчебнаяЗадача, подвестиИтог }
export function итог(задачи: Array<УчебнаяЗадача>) -> string {
подвестиИтог(задачи)
}Каждый файл .tpz является модулем. Размещайте импорты в начале файла. Путь с точками начинается от корня компиляции, поэтому src.plan указывает на src/plan.tpz. Другие модули могут импортировать объявления с export. Этот импорт открывает два указанных объявления, а закрытые объявления остаются недоступными.
Форма import путь.модуля { Имя }, export function имя(...)
Руководство Модули и видимость
Форматирование, проверка, тест, запуск и сборка
Используйте эти команды при работе с пакетом. Примеры предполагают наличие манифеста пакета, файла блокировки и tests/plan.tpz в рабочей папке. Создайте их по разделу Первое приложение.
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 buildfmt --check сообщает об отличиях форматирования, не меняя файлы. check сообщает об ошибках исходного кода без запуска. test показывает результаты тестов, а run выводит результат программы. build записывает нативный исполняемый файл и вспомогательные файлы в папку build. Нативная сборка требует Rust и Cargo для вашей платформы. При успехе каждая команда завершается с кодом 0. Ожидаемый вывод приведён в связанном уроке.
Форма topaz <задача> [входы]
Руководство CLI и диагностика
Следующие направления
Выберите тему, которая нужна вашей программе.
- Передавайте значения слева направо по разделу Конвейеры и заполнители.
- Создавайте коллекции из вложенных циклов и условий по разделу Коллекции и включения.
- Определяйте протоколы для проверки необходимых членов типа по разделу Записи и номинальные данные.
- Пишите функции с параметром типа по разделу Функции и обобщения.
- Запускайте именованные задачи вместе с тайм-аутом по разделу Конкурентность.
- Читайте файлы и закрывайте ресурсы по разделу Файлы и ресурсы.
- Соберите пакет WASM для вызова из JavaScript по разделу WASM и песочница.
- Работайте с байтами, буферами, хешами и кодеками по разделу Базовая библиотека.
Чтобы собрать первое приложение шаг за шагом, вернитесь к учебному маршруту. Сначала изучите значения и функции, данные и управление потоком, затем ошибки и ресурсы, а после переходите к первому приложению.