68 lines
1.2 KiB
Plaintext
68 lines
1.2 KiB
Plaintext
### Linking
|
|
|
|
[
|
|
Datatype links
|
|
Funcon initialise-linking
|
|
Funcon link
|
|
Funcon fresh-link
|
|
Funcon fresh-initialised-link Alias fresh-init-link
|
|
Funcon set-link
|
|
Funcon follow-if-link
|
|
]
|
|
|
|
|
|
Meta-variables
|
|
T <: values
|
|
|
|
|
|
Datatype
|
|
links ::= link(_:variables)
|
|
|
|
|
|
Funcon
|
|
initialise-linking(X:=>T) : =>T
|
|
~> initialise-storing(X)
|
|
/*
|
|
`initialise-linking(X)` ensures that the entities used by the funcons for
|
|
linking are properly initialised.
|
|
*/
|
|
|
|
|
|
Funcon
|
|
fresh-link(T) : =>links
|
|
~> link(allocate-variable(T))
|
|
|
|
|
|
Funcon
|
|
fresh-initialised-link(T, V:T) : =>links
|
|
~> link(allocate-initialised-variable(T, V))
|
|
Alias
|
|
fresh-init-link = fresh-initialised-link
|
|
|
|
|
|
Funcon
|
|
set-link(_:links, _:T) : =>null-type
|
|
/*
|
|
The value of a link can be set only once.
|
|
*/
|
|
Rule
|
|
set-link(link(Var:variables), V:T) ~> initialise-variable(Var, V)
|
|
|
|
|
|
Funcon
|
|
follow-link(_:links) : =>values
|
|
Rule
|
|
follow-link(link(Var:variables)) ~> assigned(Var)
|
|
|
|
|
|
Funcon
|
|
follow-if-link(_:values) : =>values
|
|
/*
|
|
If `V` is a link, `follow-if-link(V)` computes the set value, and
|
|
otherwise it evaluates to `V`.
|
|
*/
|
|
Rule
|
|
follow-if-link(link(Var:variables)) ~> assigned(Var)
|
|
Rule
|
|
follow-if-link(V:~links) ~> V
|