Link Search Menu Expand Document

Funcons-beta : Abrupting.cbs | PRETTY | PDF


Abruptly terminating

[
  Funcon stuck
  Entity abrupted
  Funcon finalise-abrupting
  Funcon abrupt
  Funcon handle-abrupt
  Funcon finally
]
Meta-variables
  T, T′, T′′ <: values
Funcon
  stuck : =>empty-type

stuck does not have any computation. It is used to represent the result of a transition that causes the computation to terminate abruptly.

Entity
  _ --abrupted(_:values?)-> _

abrupted(V) in a label on a tranistion indicates abrupt termination for reason V. abrupted( ) indicates the absence of abrupt termination.

Funcon
  finalise-abrupting(X:=>T) : =>T|null-type
   ~> handle-abrupt(X, null-value)

finalise-abrupting(X) handles abrupt termination of X for any reason.

Funcon
  abrupt(_:values) :=>empty-type

abrupt(V) terminates abruptly for reason V.

Funcon
  handle-abrupt(_:T′=>T, _:T′′=>T) : T′=>T

handle-abrupt(X, Y) first evaluates X. If X terminates normally with value V, then V is returned and Y is ignored. If X terminates abruptly for reason V, then Y is executed with V as given value.

handle-abrupt(X, Y) is associative, with abrupt(given) as left and right unit. handle-abrupt(X, else(Y, abrupt(given))) ensures propagation of abrupt termination for the given reason if Y fails

Rule
                    X --abrupted( )-> X′
  --------------------------------------------------------
  handle-abrupt(X, Y) --abrupted( )-> handle-abrupt(X′, Y)
Rule
                    X --abrupted(V:T′′)-> X′
  ----------------------------------------------
  handle-abrupt(X, Y) --abrupted( )-> give(V, Y)
Rule
  handle-abrupt(V:T, Y) ~> V
Funcon
  finally(_:=>T, _:=>null-type) : =>T

finally(X, Y) first executes X. If X terminates normally with value V, then Y is executed before terminating normally with value V. If X terminates abruptly for reason V, then Y is executed before terminating abruptly with the same reason V.

Rule
              X --abrupted( )-> X′
  --------------------------------------------
  finally(X, Y) --abrupted( )-> finally(X′, Y)
Rule
              X --abrupted(V:values)-> X′
  -----------------------------------------------------
  finally(X, Y) --abrupted()-> sequential(Y, abrupt(V))
Rule
  finally(V:T, Y) ~> sequential(Y,V)