Здесь вы узнаете, как записывать имена и значения и разбивать длинные выражения на строки. Правила помогут определить, завершает ли перенос инструкцию или продолжает выражение.
Запустите файл с многострочным выражением
Установите Топаз по разделу Первая программа и сохраните код в lexical-layout.tpz.
let готово = true
let архивировано = false
let отсутствует = null
let состояние = "ready"
let итого =
40 +
2
print("{состояние}: {готово}, {архивировано}, {отсутствует}, {итого}")В папке с файлом выполните проверку и запуск.
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 кластеров графем недоступны.
Правила группировки описаны в разделе Операторы и выражения, аннотации типов в разделе Типы. Другие замены ищите в разделе Запрещённые и отложенные формы.