Стандартная библиотека и среда

Поведение среды выполнения

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

Даже после успешной проверки программа во время выполнения создаёт значения, вывод и возможные ошибки. Начнём с того, что видит пользователь: выводимый текст, вычисленные значения, порядок элементов в коллекциях и явную ошибку выполнения.

Наблюдаем обычные значения

Сохраните следующий код как runtime-behavior.tpz:

TOPAZ
let значения = [10, 20]

print("int: {7 / 2} {-7 % 3}")
print("float: {1.5 + 1.5}")
print("safe: {значения.get(9)}")

Запустите его командой topaz run runtime-behavior.tpz:

Вывод
int: 3 -1
float: 3.0
safe: None

print принимает только string. Перед вызовом интерполяция преобразует целое число, число с плавающей точкой и Option в отображаемый текст. В Prelude отсутствует отдельная публичная функция println. Используйте именно функцию print, показанную здесь.

int — знаковое 64-разрядное целое. Целочисленное деление округляется к нулю, а остаток получает знак делимого. Переполнение во время выполнения и деление на ноль вызывают ошибку выполнения, а не циклическое переполнение. float соответствует IEEE-754 binary64 и подчиняется правилам арифметики с плавающей точкой, а не десятичной арифметики.

значения.get(9) возвращает None. Отсутствие элемента является штатным результатом безопасного поиска.

Наблюдаем нарушение контракта

Сравните безопасный поиск с прямым обращением по индексу:

Сохраните второй фрагмент как intentional-fault.tpz:

TOPAZ
let задачи = ["Run first program", "Build application"]
print(задачи[2])

topaz run intentional-fault.tpz завершается с ненулевым кодом выхода и указывает место в исходном файле:

Вывод
error[TPZ4001]: index 2 is out of bounds for an array of length 2
 --> intentional-fault.tpz:2:7
  |
2 | print(задачи[2])
  |       ^^^^^^^^^

Ошибка выполнения — это не None, не Err и не какое-либо другое значение. Она прерывает вычисление, и её нельзя перехватить постфиксным ?, операторами необязательных значений или concurrent. Заведомо некорректная константная арифметика может быть отклонена ещё на этапе проверки. Ошибка выполнения возникает, когда программа достигает недопустимого условия во время выполнения.

Выбираем наблюдаемую модель неудачи

СитуацияЧто использовать или ожидать
Отсутствие значения является нормальнымOption, например None из get
Вызывающий код может отреагировать на причинуResult с Ok или Err
Выполняемый код нарушил контракт средыОшибка и ненулевой код процесса
Исходный код неверен до запускаСтатическая диагностика topaz check

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

Что остаётся устойчивым

Строки сравниваются как точные последовательности скаляров Unicode без неявной нормализации. Массивы сохраняют порядок элементов. Снимок ключей Map следует порядку их вставки, а операции над коллекциями — порядку, указанному в своём контракте. Номинальные значения сохраняют имя конструктора, если этого требует каноническое отображение.

Реализации могут использовать разное внутреннее представление только при одинаковом наблюдаемом результате. В противном случае целевая платформа должна явно отклонить программу. Это правило не делает внутренние вспомогательные функции целевой платформы частью публичного API Топаза.

Что намеренно не задано

Не следует рассчитывать на циклическое переполнение целых чисел по правилам среды, определённый порядок в хеш-таблицах среды, зависимое от локали форматирование чисел, неявную нормализацию Unicode, перехват ошибок выполнения, очистку ресурсов после аварийного завершения, неявные права доступа к файловой системе или сети и гарантии производительности. Порядок выполнения конкурентных задач и смешивание их вывода также намеренно не определены.

Модель значений описана на странице Null, Option, Result и ошибки, тайм-ауты и границы порядка — на странице Конкурентность, а основные компоненты — в разделе Базовая библиотека.