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'