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);