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

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

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

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

Установите Топаз по инструкции «Первая программа». Сохраните два примера в отдельных файлах и запускайте каждый из его каталога.

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

Сохраните код в 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

7 / 2 даёт 3, поскольку целочисленное деление отбрасывает дробную часть в направлении нуля. -7 % 3 даёт -1, поскольку остаток получает знак делимого. 1.5 + 1.5 выводится как 3.0.

значения.get(9) возвращает None, потому что в массиве нет элемента с индексом 9. get представляет отсутствие как значение, поэтому программа продолжает работу.

print принимает строку и добавляет перевод строки. Перед вызовом интерполяция преобразует числа и Option в текст. Для вывода строки используйте print. Свободной функции println нет.

Наблюдаем неверный индекс массива

Сохраните второй пример в 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])
  |       ^^^^^^^^^

В массиве два элемента с индексами 0 и 1. Замените задачи[2] на задачи[1] и запустите программу снова, чтобы вывести Build application. Если отсутствие индекса допустимо, используйте задачи.get(2) и обработайте None.

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

Различаем результаты неудачи

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

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

Следующие условия вызывают ошибку при достижении операции во время выполнения.

ОперацияНедопустимое условие
Прямое индексирование массиваИндекс вне массива
Целочисленное деление или остатокДелитель равен нулю
Целочисленная арифметикаРезультат выходит за диапазон целого
Перебор диапазонаШаг равен нулю
Целочисленное возведение в степеньПоказатель отрицательный
matchНи одна ветка не соответствует значению

Проверка может отклонить неверную константную арифметику до запуска. Для значений, вычисляемых во время выполнения, проверяйте вход перед операцией.

Глубина вызовов ограничена 1000 кадрами на всех путях выполнения. Это означает 1000 активных вложенных вызовов. Более глубокий вызов сообщает TPZ5009 в месте вызова. Параметра командной строки для увеличения предела нет.

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

Строки сравниваются как точные последовательности скаляров Unicode. Скаляр соответствует одной кодовой точке Unicode вне диапазона суррогатов. Топаз не нормализует разные последовательности автоматически к одному написанию. Например, готовый символ "é" и "é" не равны, хотя могут выглядеть одинаково.

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

При выводе значений record, enum и newtype сохраняется имя конструктора типа. Формы вывода включают Name { field: value }, Name.Variant и Name(value). Целевые платформы могут хранить значения по-разному, сохраняя правила языка для вывода и выполнения.

Обработка значений описана в разделе Null, Option, Result и ошибки, тайм-ауты в разделе «Конкурентность», функции преобразования в базовой библиотеке. Строки и шаблоны объясняют позиции скаляров.