2.7.2. ВЫЧИСЛЕНИЕ РЕЗУЛЬТАТНЫХ ВЫРАЖЕНИЙ

Результатные выражения служат для порождения объектных выражений.

Результатное выражение Re может быть вычислено в любой среде Env, при условии, что Env дает значения для всех переменных входящих в Re.

Если вычисление результатного выражения Re заканчивается, то результатом этого вычисления является либо объектное выражение Oe, либо неуспех $fail(0), либо ошибка $error(Oe), где Oe - сообщение об ошибке.

Вычисление вызовов функций может приводить к изменению глобального состояния программы (например, в случае выполнения операций ввода-вывода или каких-то действий над объектами), поэтому, если результатное выражение содержит вызовы функций, его вычисление может также привести к изменению глобального состояния.

Запись Env,St |- Re => X,St' означает, что результатом вычисления результатного выражения Re в среде Env является X. При этом, если вычисление началось в глобальном состоянии St, оно закончится в глобальном состоянии St'.

Результатное выражение Re вычисляется слева направо. При этом вместо переменных подставляются их значения и выполняются вызовы функций.

Вычисление вызовов функций выполняется следующим образом. Если вызов имеет вид <Fname Re>, то вычисляется результатное выражение Re. Если в результате получится объектное выражение Oe, то функция Fname применяется к Oe.

Запись St |- <Fname Oe> => X,St' означает, что результатом применения функции Fname к объектному выражению Oe является X, причем, если вычисление началось в глобальном состоянии St, оно закончится в глобальном состоянии St'.

Env,St |- => ,St

 

Env,St |- Re => Oe',St'

Env,St'|- Rt => Oe",St"

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

Env,St |- Re Rt => Oe' Oe",St"

 

Env,St |- Re => Oe',St'

Env,St'|- Rt => $fail(0),St"

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

Env,St |- Re Rt => $fail(0),St"

 

Env,St |- Re => Oe',St'

Env,St'|- Rt => $error(Oe"),St"

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

Env,St |- Re Rt => $error(Oe"),St"

 

Env,St |- Re => $fail(0),St'

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

Env,St |- Re Rt => $fail(0),St'

 

Env,St |- Re => $error(Oe'),St'

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

Env,St |- Re Rt => $error(Oe'),St'

 

Env,St |- Os => Os,St

Env,St |- V => Oe,St

где Oe=Env(V).

 

Env,St |- Re => Oe,St'

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

Env,St |- (Re) => (Oe),St'

 

Env,St |- Re => $fail(0),St'

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

Env,St |- (Re) => $fail(0),St'

 

Env,St |- Re => $error(Oe),St'

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

Env,St |- (Re) => $error(Oe),St'

 

Env,St |- Re => Oe,St'

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

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

Env,St |- <Fname Re> => X,St"

 

Env,St |- Re => $fail(0),St'

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

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

 

Env,St |- Re => $error(Oe),St'

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

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