2.12.3. ОБЪЯВЛЕНИЯ ФУНКЦИЙ

$ ОбъявлениеФункции =

$ "$func" ИмяФункции

$ ВходнойФормат "=" ВыходнойФормат ";" |

$ "$func?" ИмяФункции

$ ВходнойФормат "=" ВыходнойФормат ";".

$ ИмяФункции = Слово.

$ ВходнойФормат = ФорматноеВыражение.

$ ВыходнойФормат = ФорматноеВыражение.

$ ФорматноеВыражение = ЖесткоеВыражение.

Объявление функции вводит символическое имя для функции и должно предшествовать как определению функции, так и всем использованиям ее имени.

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

Входной и выходной форматы должны быть жесткими, т.е. на каждом уровне скобок может находиться максимум одна e-переменная или v-переменная.

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

Если в объявлении функции использовано ключевое слово $func, это означает, что функция - безоткатная, т.е. ее вычисление может завершиться либо успешной выдачей результата, либо выдачей ошибки.

Если в объявлении функции использовано ключевое слово $func?, это означает, что функция - откатная, т.е. ее вычисление может завершиться либо успешной выдачей результата, либо выдачей неуспеха, либо выдачей ошибки.

Например:

$func Interpreter (e.Program) (e.Input) = e.Result;

$func? Attempt t.Arg = s.Result1 t.Result2 (e.Result3);