Основы языка

Лексика и структура исходного кода

Записывайте имена, комментарии и литералы и определяйте, когда выражение продолжается на следующей строке.

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

Запустите файл с многострочным выражением

Установите Топаз по разделу Первая программа и сохраните код в lexical-layout.tpz.

TOPAZ
let готово = true
let архивировано = false
let отсутствует = null
let состояние = "ready"

let итого =
    40 +
    2

print("{состояние}: {готово}, {архивировано}, {отсутствует}, {итого}")

В папке с файлом выполните проверку и запуск.

BASH
topaz check lexical-layout.tpz
topaz run lexical-layout.tpz

Проверка проходит, программа выводит следующий текст.

Вывод
ready: true, false, null, 42

Первые четыре объявления занимают по одной строке. Объявление итого занимает три строки и даёт 42. состояние является допустимым именем в Unicode. Ключевые слова let, true, false и null сохраняют английское написание.

Выберите место переноса

После = и + требуется ещё одно значение, поэтому выражение для итого продолжается. Отступы облегчают чтение. Компилятор группирует код по разделителям и операторам.

ЗадачаСпособ записи
Завершить объявление верхнего уровня или инструкцию блокаНачать следующий элемент с новой строки
Продолжить арифметическое выражение или конвейерОставить оператор в конце предыдущей строки
Перенести аргументы, элементы коллекции или поля записиСохранить окружающие скобки и разделить элементы запятыми
Явно задать группировкуДобавить круглые скобки

В круглых и квадратных скобках, фигурных скобках записи и списках параметров или аргументов переносы работают как пробелы. В блоке, теле match или concurrent завершённая строка может закончить элемент.

Инструкции также можно разделять знаком ;. Между элементами списка ставьте запятые. else на новой строке продолжает соответствующее выражение if или concurrent с тайм-аутом. Специальный символ продолжения строки не нужен.

Запишите имена, комментарии и литералы

Идентификатором называется имя, например итого или состояние. Оно начинается с буквы Unicode, _ или эмодзи. Далее допустимы также цифры Unicode. _internal является обычным именем. Одиночный _ отбрасывает значение в шаблоне или служит заполнителем аргумента в конвейере. Прочитать его как переменную нельзя.

Литерал записывает значение непосредственно, например 42, true, null или "ready".

ЗадачаФорма
Комментарий до конца строки// комментарий
Комментарий на нескольких строках/* комментарий */, без вложенных блочных комментариев
Целое или вещественное числоДесятичная запись, например 42 или 1.5
ТекстДвойные кавычки, последовательности вроде \n и интерполяция вроде {итого}
Многострочный текстТройные кавычки

Экспоненциальная запись 1e21, другие системы счисления и разделители цифр вроде 1_000 не поддерживаются. Запишите десятичные цифры полностью или вычислите значение.

В многострочном тексте каждая непустая строка должна начинаться с пробельного префикса закрывающих кавычек на отдельной строке. Правило отступов, поведение публичного интерпретатора 5.20.3 и доступ по скалярам Unicode описаны в разделе Строки и шаблоны. Топаз не нормализует строки неявно.

Исправьте неожиданную группировку

Если вычисление обрывается на переносе строки, проверьте положение + или -. В начале новой инструкции эти знаки могут стать унарными операторами над одним значением. Перенесите оператор в конец предыдущей строки или заключите выражение в круглые скобки.

Компилятор выбирает самый длинный допустимый токен. Он читает ?. как опциональный доступ. Чтобы обратиться к полю после передачи ошибки Result, напишите (expr?).field. Аналогично ... отличается от .. в шаблоне остатка и оператора диапазона ..<.

Используйте двойные кавычки для строк. Одинарные кавычки и символьные литералы не поддерживаются. Вместо s[i] или s.length применяйте операции Array к s.scalars(). Прямые срезы строк и API кластеров графем недоступны.

Правила группировки описаны в разделе Операторы и выражения, аннотации типов в разделе Типы. Другие замены ищите в разделе Запрещённые и отложенные формы.