2.11. ОПРЕДЕЛЕНИЯ ФУНКЦИЙ

$ ОпределениеФункции =

$ ИмяФункции ТелоФункции ";".

$ ТелоФункции =

$ ОбразцовоеРаспутье | Предложение.

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

Если определение функции имеет вид Fname Snt; , оно эквивалентно определению Fname \{ Snt; }; .

Пусть определение функции Fname имеет вид

Fname Palt

Тогда вычисление вызова этой функции, имеющего вид <Fname Oe> сводится к вычислению источника Oe : Palt. Если при этом получается объектное выражение Oe' или ошибка $error(Oe'), они и считаются результатом вычисления вызова. Если же получается неуспех $fail(k), то дальнейшие действия зависят от того, была ли функция Fname объявлена как откатная или безоткатная. Для откатной функции в качестве результата выдается $fail(0), а для безоткатной - $error(Fname "Unexpected fail").

 

{},0,St |- Oe : Palt => Oe',St'

-------------------------------

St |- <Fname Oe> => Oe',St'

 

{},0,St |- Oe : Palt => $fail(k),St'

------------------------------------

St |- <Fname Oe> => $fail(0),St'

где функция Fname - откатная, т.е. объявлена как

$func? Fname Farg = Fres;.

 

{},0,St |- Oe : Palt => $fail(k),St'

-------------------------------------------------------

St |- <Fname Oe> => $error(Fname "Unexpected fail"),St'

где функция Fname - безоткатная, т.е. объявлена как

$func Fname Farg = Fres;.

 

{},0,St |- Oe : Palt => $error(Oe'),St'

---------------------------------------

St |- <Fname Oe> => $error(Oe'),St'

 

В вышеприведенных правилах вывода предполагается, что функция Fname имеет определение Fname Palt.