Разделы сайта находятся в разработке.
Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.
Возврат, прерывания и обработка ошибок
Последовательность команд (блок кода) можно прервать в любом месте специальными операторами прерывания. В TrustLang используются два вида прерываний, которые по смыслу соответствуют своей записи:
- «положительное» прерывание
++— возврат значения/сквозная передача потока (аналогreturn); - «отрицательное» прерывание
--— ошибка (аналогthrow).
Прерывание может возвращать значение: ++ 'Строка' ++ — вернуть строку, -- err -- — «бросить»
ошибку (примерный аналог throw err). Если значение не указано, прерывание не возвращает ничего
(пустое значение).
Именованные прерывания: локальный переход и возврат
Именованные блоки кода могут выступать локальными метками передачи потока управления. Если перед оператором прерывания указать пространство имён/метку блока, то такое именованное прерывание действует только для указанного блока:
block ++— break по меткеblock(выход из блока);block -+— continue по метке (переход на первую инструкцию блока).
Один и тот же фрагмент — именованный цикл с выходом по метке и переходом к началу блока — двумя формами:
| Макросы DSL | Базовый синтаксис |
|---|---|
| |
Тело функции — это блок кода, чьё имя совпадает с полным именем функции. Поэтому «положительное»
прерывание по метке функции возвращает результат из неё (func_name ++ value ++); в DSL этому
соответствует @return.
Перехват прерываний (try/catch)
Неименованные прерывания можно «ловить». Для перехвата используются блоки кода со специальной
семантикой, которые оборачивают тело в try/catch по классу прерывания:
{+ ... +}— перехватывает положительные прерывания (IntPlus);{- ... -}— перехватывает отрицательные прерывания (IntMinus);{* ... *}— перехватывает оба типа (IntAny).
Статус реализации (важные уточнения):
- неименованное
++ value ++всегда бросаетIntPlus(положительное/сквозное), а-- err --—IntMinus(ошибка), независимо от наличия и глубины обработчиков; - именованное
func ++ value ++— обычныйreturnиз функции (метка обязана быть текущей функцией или глобальной::); - неперехваченный класс пробрасывается насквозь; сквозной
++проходит через вызовы функций до ближайшего{+}/{*}; - перехват значения (например, через
match) пока не реализован — перехваченное прерывание поглощается.
Обработка ошибок
«Отрицательное» прерывание используется для возврата ошибки лишь условно — оба вида прерываний
равнозначны. Совместная обработка перехваченного значения в классическом стиле try/catch —
через блоки перехвата ({*}, {-}, {+}) и оператор оценки выражения — пока не
реализована: перехваченное прерывание поглощается (см. Статус).
См. также
- Менеджер контекста
with— RAII и освобождение ресурсов при выходе из блока. - Многопоточность и асинхронность — запланированные прерывания корутин
(
@co_yield/@co_await/@co_returnне реализованы). - DSL-эквиваленты (
@return,@break,@continue) — Keyword syntax (DSL).