Разделы сайта находятся в разработке.

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

Возврат, прерывания и обработка ошибок

Последовательность команд (блок кода) можно прервать в любом месте специальными операторами прерывания. В TrustLang используются два вида прерываний, которые по смыслу соответствуют своей записи:

  • «положительное» прерывание ++ — возврат значения/сквозная передача потока (аналог return);
  • «отрицательное» прерывание -- — ошибка (аналог throw).

Прерывание может возвращать значение: ++ 'Строка' ++ — вернуть строку, -- err -- — «бросить» ошибку (примерный аналог throw err). Если значение не указано, прерывание не возвращает ничего (пустое значение).

Именованные прерывания: локальный переход и возврат

Именованные блоки кода могут выступать локальными метками передачи потока управления. Если перед оператором прерывания указать пространство имён/метку блока, то такое именованное прерывание действует только для указанного блока:

  • block ++ — break по метке block (выход из блока);
  • block -+ — continue по метке (переход на первую инструкцию блока).

Один и тот же фрагмент — именованный цикл с выходом по метке и переходом к началу блока — двумя формами:

Макросы DSLБазовый синтаксис
outer {
    @loop {
        @break outer;     # break по метке outer (как outer ++)
        @continue outer;  # continue по метке outer (как outer -+)
    };
};
outer {
    [1] <-> {
        outer ++;   # break по метке outer
        outer -+;   # continue по метке outer
    };
};

Тело функции — это блок кода, чьё имя совпадает с полным именем функции. Поэтому «положительное» прерывание по метке функции возвращает результат из неё (func_name ++ value ++); в DSL этому соответствует @return.

Перехват прерываний (try/catch)

Неименованные прерывания можно «ловить». Для перехвата используются блоки кода со специальной семантикой, которые оборачивают тело в try/catch по классу прерывания:

  • {+ ... +} — перехватывает положительные прерывания (IntPlus);
  • {- ... -} — перехватывает отрицательные прерывания (IntMinus);
  • {* ... *} — перехватывает оба типа (IntAny).

Статус реализации (важные уточнения):

  • неименованное ++ value ++ всегда бросает IntPlus (положительное/сквозное), а -- err -- — IntMinus (ошибка), независимо от наличия и глубины обработчиков;
  • именованное func ++ value ++ — обычный return из функции (метка обязана быть текущей функцией или глобальной ::);
  • неперехваченный класс пробрасывается насквозь; сквозной ++ проходит через вызовы функций до ближайшего {+}/{*};
  • перехват значения (например, через match) пока не реализован — перехваченное прерывание поглощается.

Обработка ошибок

«Отрицательное» прерывание используется для возврата ошибки лишь условно — оба вида прерываний равнозначны. Совместная обработка перехваченного значения в классическом стиле try/catch — через блоки перехвата ({*}, {-}, {+}) и оператор оценки выражения — пока не реализована: перехваченное прерывание поглощается (см. Статус).

См. также