Axiom Справочник языка

11 · Процедуры и функции

Оператор RETURN

Иногда подпрограмму нужно закончить раньше последней инструкции тела — например, сразу после проверки входного аргумента. Для досрочного выхода из процедуры и для возврата вычисленного результата из функции служит RETURN; вид оператора зависит от того, в каком объявлении он записан.

Две формы

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

RETURN
RETURN <выражение>

В процедуре аргументов нет. В функции выражение вычисляет результат; его тип должен быть совместим с объявленным типом результата FUNCTION. Для результата AS STRING[] или другого массива RETURN принимает полное массивное выражение: RETURN values[], RETURN bag.values[], срез либо вызов функции с массивным результатом. Массивное имя без [] недопустимо. Полный пример приведён в статье FUNCTION. Оператор разрешён только внутри SUB или FUNCTION, включая методы TYPE; на верхнем уровне он недопустим.

Что происходит при выходе

После RETURN следующие обычные инструкции тела не выполняются. Завершается только текущий вызов, а вызывающая программа продолжает работу. Достижение END SUB завершает процедуру; достижение END FUNCTION без возвращённого значения является ошибкой времени выполнения.

Отдельного правила требуют активные обработчики FINALLY. При RETURN они выполняются все, начиная с ближайшего и заканчивая самым внешним; каждый обработчик выполняется ровно один раз. Обработчик без FINALLY не мешает выполнению внешнего FINALLY. Если RETURN выполняется внутри самого FINALLY, этот FINALLY повторно не запускается, а возвращаемое значение заменяет ранее подготовленный результат.

Порядок виден по выводу: строка из FINALLY печатается раньше значения, которое возвращает функция.

FUNCTION Value() AS INTEGER
    TRY
        RETURN 7
    FINALLY
        PRINT "finally"
    END TRY
END FUNCTION
PRINT Value()

Программа выводит:

finally
7

Значение 7 подготовлено в момент RETURN, но перед передачей его вызывающему коду выполняется FINALLY, поэтому слово печатается первым. Само значение при этом не меняется.

Диагностика

MB2012 означает RETURN вне подпрограммы. MB2006 означает RETURN со значением в SUB, MB2007 — RETURN без выражения в FUNCTION, MB2003 — несовместимый тип результата. MB3006 возникает, если выполненная ветвь функции дошла до конца без значения.

См. также

SUB · FUNCTION · TRY