Структура программы

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

Выберите строку или шаблон с тегом, посчитайте скаляры Unicode и запишите многострочный текст.

Для вывода и сравнения текста используйте строку. Шаблон с тегом сохраняет вид данных и структуру вставок для пути, регулярного выражения, команды оболочки или SQL.

Посчитайте символы строки

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

TOPAZ
let название = "Topaz 💎"
let числоСкалярных = название.scalars().length
let путьКонфигурации = p"config/topaz.toml"
let запрос = sql"SELECT name FROM projects WHERE title = {название}"

print("{название}: {числоСкалярных}")

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

BASH
topaz check strings-templates.tpz
topaz run strings-templates.tpz

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

Вывод
Topaz 💎: 7

В название семь скалярных значений Unicode, по одному на каждую букву, пробел и эмодзи. Скаляр соответствует одной кодовой точке Unicode для текста. Метод scalars() возвращает Array<string>, в котором каждый элемент содержит один скаляр.

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

Топаз сравнивает последовательности скаляров как записано. Одинаково выглядящий текст может оказаться неравным, если последовательности скаляров различаются.

Выберите строку или шаблон

ЗадачаФормаРезультат
Вывести или сравнить текст"Hello, {name}"Строка со значением, вставленным по стандартным правилам отображения
Записать несколько строк"""..."""Многострочный текст с описанными ниже правилами пробелов
Описать путьp"config/app.toml"Шаблон для нормализации пути на выбранной платформе
Описать регулярное выражениеr"^[a-z]+$"Шаблон регулярного выражения с сокращённым экранированием
Описать команду оболочкиsh"tool {argument}"Шаблон, хранящий аргумент отдельно от текста команды
Описать запрос SQLsql"WHERE id = {id}"Шаблон, хранящий вставленное значение как параметр запроса

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

Все четыре тега создают значение встроенного типа template. Указывайте его в аннотациях, например let запрос: template = sql"...". Передавайте в print строку. Интерполяция шаблона в строку выводит описание вроде <sql template, 1 part(s), 0 interpolation(s)>. Она не создаёт исполняемый запрос.

Можно прочитать тег шаблона и его текстовые части. запрос.tag возвращает "sql". запрос.parts возвращает Array<string> с элементами "SELECT name FROM projects WHERE title = " и "". Эти свойства не предоставляют доступ к вставленным значениям.

Вставляйте значения и переносите текст

Запись {expression} вставляет значение выражения в строку. Это называется интерполяцией. Обычные и многострочные строки используют одинаковые управляющие последовательности.

ЗаписьЗначение
\n, \t, \rПеренос строки, табуляция, возврат каретки
\\, \"Обратная косая черта, двойная кавычка
\{, \}Фигурные скобки как текст

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

По правилам языка начальный перенос и отступ закрывающих кавычек удаляются. Публичный интерпретатор 5.20.3 сейчас сохраняет их. Для точного текста в этом интерпретаторе используйте обычную строку с явными управляющими последовательностями, например "one\ntwo\n".

Теги p, r, sh и sql работают и с тройными кавычками. Ставьте тег вплотную к открывающей кавычке. Пробел в p "file" приводит к синтаксической ошибке.

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

Если вы написалиИспользуйте
text[0] или text.lengthtext.scalars()[0] для непустой строки или text.scalars().length
Срез строкиОперации Array над text.scalars(), если подходит разделение по скалярам
Обратные или одинарные кавычки, ${expression}Двойные кавычки и {expression}
html"..." или собственный тегОбычную строку либо один из четырёх поддерживаемых тегов по назначению

API кластеров графем и синтаксис прямых срезов строк не поддерживаются. Имя template занято встроенным типом, поэтому объявления record template, enum template и newtype template отклоняются.

Правила переноса объясняет раздел Лексика и структура исходного кода, отображение значений описано в разделе Поведение среды выполнения. Другие замены синтаксиса собраны в разделе Запрещённые и отложенные формы.