init commit again
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
### 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`.
|
||||
*/
|
||||
Rule
|
||||
abrupt(V:values) --abrupted(V)-> stuck
|
||||
|
||||
|
||||
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)
|
||||
|
||||
131
IBAF-cbs/Funcons-beta/Computations/Abnormal/Abrupting/index.md
Normal file
131
IBAF-cbs/Funcons-beta/Computations/Abnormal/Abrupting/index.md
Normal file
@@ -0,0 +1,131 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Abrupting"
|
||||
parent: Abnormal
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Abrupting.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Abruptly terminating
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_stuck">stuck</a></span>
|
||||
<i class="keyword">Entity</i> <span class="name"><a href="#Name_abrupted">abrupted</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_finalise-abrupting">finalise-abrupting</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_abrupt">abrupt</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_finally">finally</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Meta-variables</i>
|
||||
<span id="PartVariable_T"><i class="var">T</i></span>, <span id="PartVariable_T'"><i class="var">T′</i></span>, <span id="PartVariable_T''"><i class="var">T′′</i></span> <: <span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_stuck">stuck</span></span> : =><span class="name"><a href="../../../Values/Value-Types/index.html#Name_empty-type">empty-type</a></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_stuck">stuck</a></span></code> does not have any computation. It is used to represent the result of
|
||||
a transition that causes the computation to terminate abruptly.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Entity</i>
|
||||
_ --<span class="ent-name"><span id="Name_abrupted">abrupted</span></span>(_:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span><sup class="sup">?</sup>)-> _</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_abrupted">abrupted</a></span>(<i class="var">V</i>)</code> in a label on a tranistion indicates abrupt termination for
|
||||
reason <code><i class="var">V</i></code>. <code><span class="name"><a href="#Name_abrupted">abrupted</a></span>( )</code> indicates the absence of abrupt termination.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_finalise-abrupting">finalise-abrupting</span></span>(<span id="Variable153_X"><i class="var">X</i></span>:=><span id="Variable158_T"><i class="var">T</i></span>) : =><span id="Variable173_T"><i class="var">T</i></span>|<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>
|
||||
~> <span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<a href="#Variable153_X"><i class="var">X</i></a>, <span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_finalise-abrupting">finalise-abrupting</a></span>(<i class="var">X</i>)</code> handles abrupt termination of <code><i class="var">X</i></code> for any reason.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_abrupt">abrupt</span></span>(_:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>) :=><span class="name"><a href="../../../Values/Value-Types/index.html#Name_empty-type">empty-type</a></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_abrupt">abrupt</a></span>(<i class="var">V</i>)</code> terminates abruptly for reason <code><i class="var">V</i></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_abrupt">abrupt</a></span>(<span id="Variable300_V"><i class="var">V</i></span>:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>) --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>(<a href="#Variable300_V"><i class="var">V</i></a>)-> <span class="name"><a href="#Name_stuck">stuck</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_handle-abrupt">handle-abrupt</span></span>(_:<span id="Variable344_T'"><i class="var">T′</i></span>=><span id="Variable350_T"><i class="var">T</i></span>, _:<span id="Variable363_T''"><i class="var">T′′</i></span>=><span id="Variable369_T"><i class="var">T</i></span>) : <span id="Variable385_T'"><i class="var">T′</i></span>=><span id="Variable391_T"><i class="var">T</i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> first evaluates <code><i class="var">X</i></code>. If <code><i class="var">X</i></code> terminates normally with
|
||||
value <code><i class="var">V</i></code>, then <code><i class="var">V</i></code> is returned and <code><i class="var">Y</i></code> is ignored. If <code><i class="var">X</i></code> terminates abruptly
|
||||
for reason <code><i class="var">V</i></code>, then <code><i class="var">Y</i></code> is executed with <code><i class="var">V</i></code> as <code><span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span></code> value.
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> is associative, with <code><span class="name"><a href="#Name_abrupt">abrupt</a></span>(<span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span>)</code> as left and right
|
||||
unit. <code><span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<i class="var">X</i>, <span class="name"><a href="../Failing/index.html#Name_else">else</a></span>(<i class="var">Y</i>, <span class="name"><a href="#Name_abrupt">abrupt</a></span>(<span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span>)))</code> ensures propagation of
|
||||
abrupt termination for the given reason if <code><i class="var">Y</i></code> fails
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable690_X"><i class="var">X</i></a> --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>( )-> <span id="Variable677_X'"><i class="var">X′</i></span>
|
||||
--------------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<span id="Variable690_X"><i class="var">X</i></span>, <span id="Variable695_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<a href="#Variable677_X'"><i class="var">X′</i></a>, <a href="#Variable695_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable789_X"><i class="var">X</i></a> --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>(<span id="Variable752_V"><i class="var">V</i></span>:<i class="var">T′′</i>)-> <span id="Variable776_X'"><i class="var">X′</i></span>
|
||||
----------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<span id="Variable789_X"><i class="var">X</i></span>, <span id="Variable794_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="../../Normal/Giving/index.html#Name_give">give</a></span>(<a href="#Variable752_V"><i class="var">V</i></a>, <a href="#Variable794_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_handle-abrupt">handle-abrupt</a></span>(<span id="Variable842_V"><i class="var">V</i></span>:<i class="var">T</i>, <span id="Variable853_Y"><i class="var">Y</i></span>) ~> <a href="#Variable842_V"><i class="var">V</i></a></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_finally">finally</span></span>(_:=><span id="Variable878_T"><i class="var">T</i></span>, _:=><span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>) : =><span id="Variable904_T"><i class="var">T</i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_finally">finally</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> first executes <code><i class="var">X</i></code>. If <code><i class="var">X</i></code> terminates normally with
|
||||
value <code><i class="var">V</i></code>, then <code><i class="var">Y</i></code> is executed before terminating normally with value <code><i class="var">V</i></code>.
|
||||
If <code><i class="var">X</i></code> terminates abruptly for reason <code><i class="var">V</i></code>, then <code><i class="var">Y</i></code> is executed before
|
||||
terminating abruptly with the same reason <code><i class="var">V</i></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable1094_X"><i class="var">X</i></a> --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>( )-> <span id="Variable1081_X'"><i class="var">X′</i></span>
|
||||
--------------------------------------------
|
||||
<span class="name"><a href="#Name_finally">finally</a></span>(<span id="Variable1094_X"><i class="var">X</i></span>, <span id="Variable1099_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="#Name_finally">finally</a></span>(<a href="#Variable1081_X'"><i class="var">X′</i></a>, <a href="#Variable1099_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable1189_X"><i class="var">X</i></a> --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>(<span id="Variable1156_V"><i class="var">V</i></span>:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>)-> <span id="Variable1176_X'"><i class="var">X′</i></span>
|
||||
-----------------------------------------------------
|
||||
<span class="name"><a href="#Name_finally">finally</a></span>(<span id="Variable1189_X"><i class="var">X</i></span>, <span id="Variable1194_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="#Name_abrupted">abrupted</a></span>()-> <span class="name"><a href="../../Normal/Flowing/index.html#Name_sequential">sequential</a></span>(<a href="#Variable1194_Y"><i class="var">Y</i></a>, <span class="name"><a href="#Name_abrupt">abrupt</a></span>(<a href="#Variable1156_V"><i class="var">V</i></a>))
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_finally">finally</a></span>(<span id="Variable1249_V"><i class="var">V</i></span>:<i class="var">T</i>, <span id="Variable1260_Y"><i class="var">Y</i></span>) ~> <span class="name"><a href="../../Normal/Flowing/index.html#Name_sequential">sequential</a></span>(<a href="#Variable1260_Y"><i class="var">Y</i></a>,<a href="#Variable1249_V"><i class="var">V</i></a>)</code></pre></div>
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Abrupting.cbs]: Abrupting.cbs
|
||||
"CBS SOURCE FILE"
|
||||
[Funcons-beta]: /CBS-beta/docs/Funcons-beta
|
||||
"FUNCONS-BETA"
|
||||
[Unstable-Funcons-beta]: /CBS-beta/docs/Unstable-Funcons-beta
|
||||
"UNSTABLE-FUNCONS-BETA"
|
||||
[Languages-beta]: /CBS-beta/docs/Languages-beta
|
||||
"LANGUAGES-BETA"
|
||||
[Unstable-Languages-beta]: /CBS-beta/docs/Unstable-Languages-beta
|
||||
"UNSTABLE-LANGUAGES-BETA"
|
||||
[CBS-beta]: /CBS-beta "CBS-BETA"
|
||||
[PLanCompS Project]: https://plancomps.github.io
|
||||
"PROGRAMMING LANGUAGE COMPONENTS AND SPECIFICATIONS PROJECT HOME PAGE"
|
||||
[CBS-beta issues...]: https://github.com/plancomps/CBS-beta/issues
|
||||
"CBS-BETA ISSUE REPORTS ON GITHUB"
|
||||
[Suggest an improvement...]: mailto:plancomps@gmail.com?Subject=CBS-beta%20-%20comment&Body=Re%3A%20CBS-beta%20specification%20at%20Computations/Abnormal/Abrupting/Abrupting.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
@@ -0,0 +1,15 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-abrupting
|
||||
sequential(
|
||||
print finally(2, print 1),
|
||||
finally(print 3, print 4),
|
||||
else(finally(fail, print 5), print 6)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, 4, 5, 6];
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-abrupting
|
||||
sequential(
|
||||
print handle-abrupt(1, fail),
|
||||
handle-abrupt(print 2, fail),
|
||||
handle-abrupt(
|
||||
sequential(print 3, abrupt(sequential(print 4, 5))),
|
||||
print given)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, 4, 5];
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
### Breaking
|
||||
|
||||
[
|
||||
Datatype breaking
|
||||
Funcon broken
|
||||
Funcon finalise-breaking
|
||||
Funcon break
|
||||
Funcon handle-break
|
||||
]
|
||||
|
||||
|
||||
Meta-variables
|
||||
T <: values
|
||||
|
||||
|
||||
Datatype
|
||||
breaking ::= broken
|
||||
/*
|
||||
`broken` is a reason for abrupt termination.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
finalise-breaking(X:=>T) : =>T|null-type
|
||||
~> finalise-abrupting(X)
|
||||
/*
|
||||
`finalise-breaking(X)` handles abrupt termination of `X` due to executing
|
||||
`break`.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
break : =>empty-type
|
||||
~> abrupt(broken)
|
||||
/*
|
||||
`break` abruptly terminates all enclosing computations until it is handled.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
handle-break(_:=>null-type) : =>null-type
|
||||
/*
|
||||
`handle-break(X)` terminates normally when `X` terminates abruptly for the
|
||||
reason `broken`.
|
||||
*/
|
||||
Rule
|
||||
X --abrupted( )-> X'
|
||||
------------------------------------------------
|
||||
handle-break(X) --abrupted( )-> handle-break(X')
|
||||
Rule
|
||||
X --abrupted(broken)-> _
|
||||
---------------------------------------
|
||||
handle-break(X) --abrupted( )-> null-value
|
||||
Rule
|
||||
X --abrupted(V:~breaking)-> X'
|
||||
------------------------------------------------
|
||||
handle-break(X) --abrupted(V)-> handle-break(X')
|
||||
Rule
|
||||
handle-break(null-value) ~> null-value
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Breaking"
|
||||
parent: Abnormal
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Breaking.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Breaking
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Datatype</i> <span class="name"><a href="#Name_breaking">breaking</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_broken">broken</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_finalise-breaking">finalise-breaking</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_break">break</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_handle-break">handle-break</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Meta-variables</i>
|
||||
<span id="PartVariable_T"><i class="var">T</i></span> <: <span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Datatype</i>
|
||||
<span class="name"><span id="Name_breaking">breaking</span></span> ::= <span id="Name_broken">broken</span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_broken">broken</a></span></code> is a reason for abrupt termination.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_finalise-breaking">finalise-breaking</span></span>(<span id="Variable76_X"><i class="var">X</i></span>:=><span id="Variable81_T"><i class="var">T</i></span>) : =><span id="Variable96_T"><i class="var">T</i></span>|<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_finalise-abrupting">finalise-abrupting</a></span>(<a href="#Variable76_X"><i class="var">X</i></a>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_finalise-breaking">finalise-breaking</a></span>(<i class="var">X</i>)</code> handles abrupt termination of <code><i class="var">X</i></code> due to executing
|
||||
<code><span class="name"><a href="#Name_break">break</a></span></code>.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_break">break</span></span> : =><span class="name"><a href="../../../Values/Value-Types/index.html#Name_empty-type">empty-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_abrupt">abrupt</a></span>(<span class="name"><a href="#Name_broken">broken</a></span>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_break">break</a></span></code> abruptly terminates all enclosing computations until it is handled.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_handle-break">handle-break</span></span>(_:=><span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>) : =><span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-break">handle-break</a></span>(<i class="var">X</i>)</code> terminates normally when <code><i class="var">X</i></code> terminates abruptly for the
|
||||
reason <code><span class="name"><a href="#Name_broken">broken</a></span></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable307_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span id="Variable294_X'"><i class="var">X′</i></span>
|
||||
------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-break">handle-break</a></span>(<span id="Variable307_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="#Name_handle-break">handle-break</a></span>(<a href="#Variable294_X'"><i class="var">X′</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable382_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span class="name"><a href="#Name_broken">broken</a></span>)-> _
|
||||
---------------------------------------
|
||||
<span class="name"><a href="#Name_handle-break">handle-break</a></span>(<span id="Variable382_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span>
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable455_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span id="Variable421_V"><i class="var">V</i></span>:~<span class="name"><a href="#Name_breaking">breaking</a></span>)-> <span id="Variable442_X'"><i class="var">X′</i></span>
|
||||
------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-break">handle-break</a></span>(<span id="Variable455_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<a href="#Variable421_V"><i class="var">V</i></a>)-> <span class="name"><a href="#Name_handle-break">handle-break</a></span>(<a href="#Variable442_X'"><i class="var">X′</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_handle-break">handle-break</a></span>(<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span>) ~> <span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Breaking.cbs]: Breaking.cbs
|
||||
"CBS SOURCE FILE"
|
||||
[Funcons-beta]: /CBS-beta/docs/Funcons-beta
|
||||
"FUNCONS-BETA"
|
||||
[Unstable-Funcons-beta]: /CBS-beta/docs/Unstable-Funcons-beta
|
||||
"UNSTABLE-FUNCONS-BETA"
|
||||
[Languages-beta]: /CBS-beta/docs/Languages-beta
|
||||
"LANGUAGES-BETA"
|
||||
[Unstable-Languages-beta]: /CBS-beta/docs/Unstable-Languages-beta
|
||||
"UNSTABLE-LANGUAGES-BETA"
|
||||
[CBS-beta]: /CBS-beta "CBS-BETA"
|
||||
[PLanCompS Project]: https://plancomps.github.io
|
||||
"PROGRAMMING LANGUAGE COMPONENTS AND SPECIFICATIONS PROJECT HOME PAGE"
|
||||
[CBS-beta issues...]: https://github.com/plancomps/CBS-beta/issues
|
||||
"CBS-BETA ISSUE REPORTS ON GITHUB"
|
||||
[Suggest an improvement...]: mailto:plancomps@gmail.com?Subject=CBS-beta%20-%20comment&Body=Re%3A%20CBS-beta%20specification%20at%20Computations/Abnormal/Breaking/Breaking.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
@@ -0,0 +1,16 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-breaking
|
||||
sequential(
|
||||
print sequential(handle-break(null-value),0),
|
||||
handle-break(print 1),
|
||||
print sequential(handle-break(
|
||||
sequential(print 2, break, fail)),3)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [0, 1, 2, 3];
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
### Continuing
|
||||
|
||||
[
|
||||
Datatype continuing
|
||||
Funcon continued
|
||||
Funcon finalise-continuing
|
||||
Funcon continue
|
||||
Funcon handle-continue
|
||||
]
|
||||
|
||||
|
||||
Meta-variables
|
||||
T <: values
|
||||
|
||||
|
||||
Datatype
|
||||
continuing ::= continued
|
||||
/*
|
||||
`continued` is a reason for abrupt termination.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
finalise-continuing(X:=>T) : =>T|null-type
|
||||
~> finalise-abrupting(X)
|
||||
/*
|
||||
`finalise-continuing(X)` handles abrupt termination of `X` due to executing
|
||||
`continue`.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
continue : =>empty-type
|
||||
~> abrupt(continued)
|
||||
/*
|
||||
`continue` abruptly terminates all enclosing computations until it is handled.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
handle-continue(_:=>null-type) : =>null-type
|
||||
/*
|
||||
`handle-continue(X)` terminates normally when `X` terminates abruptly for the
|
||||
reason `continued`.
|
||||
*/
|
||||
Rule
|
||||
X --abrupted( )-> X'
|
||||
------------------------------------------------------
|
||||
handle-continue(X) --abrupted( )-> handle-continue(X')
|
||||
Rule
|
||||
X --abrupted(continued)-> _
|
||||
--------------------------------------------
|
||||
handle-continue(X) --abrupted( )-> null-value
|
||||
Rule
|
||||
X --abrupted(V:~continuing)-> X'
|
||||
------------------------------------------------------
|
||||
handle-continue(X) --abrupted(V)-> handle-continue(X')
|
||||
Rule
|
||||
handle-continue(null-value) ~> null-value
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Continuing"
|
||||
parent: Abnormal
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Continuing.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Continuing
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Datatype</i> <span class="name"><a href="#Name_continuing">continuing</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_continued">continued</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_finalise-continuing">finalise-continuing</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_continue">continue</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_handle-continue">handle-continue</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Meta-variables</i>
|
||||
<span id="PartVariable_T"><i class="var">T</i></span> <: <span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Datatype</i>
|
||||
<span class="name"><span id="Name_continuing">continuing</span></span> ::= <span id="Name_continued">continued</span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_continued">continued</a></span></code> is a reason for abrupt termination.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_finalise-continuing">finalise-continuing</span></span>(<span id="Variable76_X"><i class="var">X</i></span>:=><span id="Variable81_T"><i class="var">T</i></span>) : =><span id="Variable96_T"><i class="var">T</i></span>|<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_finalise-abrupting">finalise-abrupting</a></span>(<a href="#Variable76_X"><i class="var">X</i></a>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_finalise-continuing">finalise-continuing</a></span>(<i class="var">X</i>)</code> handles abrupt termination of <code><i class="var">X</i></code> due to executing
|
||||
<code><span class="name"><a href="#Name_continue">continue</a></span></code>.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_continue">continue</span></span> : =><span class="name"><a href="../../../Values/Value-Types/index.html#Name_empty-type">empty-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_abrupt">abrupt</a></span>(<span class="name"><a href="#Name_continued">continued</a></span>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_continue">continue</a></span></code> abruptly terminates all enclosing computations until it is handled.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_handle-continue">handle-continue</span></span>(_:=><span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>) : =><span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-continue">handle-continue</a></span>(<i class="var">X</i>)</code> terminates normally when <code><i class="var">X</i></code> terminates abruptly for the
|
||||
reason <code><span class="name"><a href="#Name_continued">continued</a></span></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable307_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span id="Variable294_X'"><i class="var">X′</i></span>
|
||||
------------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-continue">handle-continue</a></span>(<span id="Variable307_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="#Name_handle-continue">handle-continue</a></span>(<a href="#Variable294_X'"><i class="var">X′</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable382_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span class="name"><a href="#Name_continued">continued</a></span>)-> _
|
||||
--------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-continue">handle-continue</a></span>(<span id="Variable382_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span>
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable455_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span id="Variable421_V"><i class="var">V</i></span>:~<span class="name"><a href="#Name_continuing">continuing</a></span>)-> <span id="Variable442_X'"><i class="var">X′</i></span>
|
||||
------------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-continue">handle-continue</a></span>(<span id="Variable455_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<a href="#Variable421_V"><i class="var">V</i></a>)-> <span class="name"><a href="#Name_handle-continue">handle-continue</a></span>(<a href="#Variable442_X'"><i class="var">X′</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_handle-continue">handle-continue</a></span>(<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span>) ~> <span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Continuing.cbs]: Continuing.cbs
|
||||
"CBS SOURCE FILE"
|
||||
[Funcons-beta]: /CBS-beta/docs/Funcons-beta
|
||||
"FUNCONS-BETA"
|
||||
[Unstable-Funcons-beta]: /CBS-beta/docs/Unstable-Funcons-beta
|
||||
"UNSTABLE-FUNCONS-BETA"
|
||||
[Languages-beta]: /CBS-beta/docs/Languages-beta
|
||||
"LANGUAGES-BETA"
|
||||
[Unstable-Languages-beta]: /CBS-beta/docs/Unstable-Languages-beta
|
||||
"UNSTABLE-LANGUAGES-BETA"
|
||||
[CBS-beta]: /CBS-beta "CBS-BETA"
|
||||
[PLanCompS Project]: https://plancomps.github.io
|
||||
"PROGRAMMING LANGUAGE COMPONENTS AND SPECIFICATIONS PROJECT HOME PAGE"
|
||||
[CBS-beta issues...]: https://github.com/plancomps/CBS-beta/issues
|
||||
"CBS-BETA ISSUE REPORTS ON GITHUB"
|
||||
[Suggest an improvement...]: mailto:plancomps@gmail.com?Subject=CBS-beta%20-%20comment&Body=Re%3A%20CBS-beta%20specification%20at%20Computations/Abnormal/Continuing/Continuing.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
@@ -0,0 +1,16 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-continuing
|
||||
sequential(
|
||||
print sequential(handle-continue(null-value),0),
|
||||
handle-continue(print 1),
|
||||
print sequential(handle-continue(
|
||||
sequential(print 2, continue, fail)),3)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [0, 1, 2, 3];
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
### Controlling
|
||||
|
||||
[
|
||||
Datatype continuations
|
||||
Funcon continuation
|
||||
Entity plug-signal
|
||||
Funcon hole
|
||||
Funcon resume-continuation
|
||||
Entity control-signal
|
||||
Funcon control
|
||||
Funcon delimit-current-continuation Alias delimit-cc
|
||||
]
|
||||
|
||||
Meta-variables
|
||||
T, T1, T2 <: values
|
||||
|
||||
Datatype
|
||||
continuations(T1,T2) ::= continuation(_:abstractions(()=>T2))
|
||||
/*
|
||||
`continuations(T1, T2)` consists of abstractions whose bodies contain a `hole`,
|
||||
and which will normally compute a value of type `T2` when the `hole` is plugged
|
||||
with a value of type `T1`.
|
||||
*/
|
||||
|
||||
Entity
|
||||
_ --plug-signal(V?:values?)-> _
|
||||
/*
|
||||
A plug-signal contains the value to be filled into a `hole` in a continuation,
|
||||
thereby allowing a continuation to resume.
|
||||
*/
|
||||
|
||||
Funcon
|
||||
hole : =>values
|
||||
/*
|
||||
A `hole` in a term cannot proceed until it receives a plug-signal
|
||||
containing a value to plug the hole.
|
||||
*/
|
||||
Rule
|
||||
hole --plug-signal(V)-> V
|
||||
|
||||
Funcon
|
||||
resume-continuation(K:continuations(T1, T2), V:T1) : =>T2
|
||||
/*
|
||||
`resume-continuation(K, V)` resumes a continuation `K` by plugging the value
|
||||
`V` into the `hole` in the continuation.
|
||||
*/
|
||||
Rule
|
||||
X --plug-signal(V)-> X'
|
||||
---------------------------------------------------------------------------
|
||||
resume-continuation(continuation(abstraction(X)), V:T) --plug-signal()-> X'
|
||||
|
||||
|
||||
Entity
|
||||
_ --control-signal(F?:(functions(continuations(T1, T2), T2))?)-> _
|
||||
/*
|
||||
A control-signal contains the function to which control is about to be passed
|
||||
by the enclosing `delimit-current-continuation(X)`.
|
||||
*/
|
||||
|
||||
Funcon
|
||||
control(F:functions(continuations(T1, T2), T2)) : =>T1
|
||||
/*
|
||||
`control(F)` emits a control-signal that, when handled by an enclosing
|
||||
`delimit-current-continuation(X)`, will apply `F` to the current continuation of
|
||||
`control(F)`, (rather than proceeding with that current continuation).
|
||||
*/
|
||||
Rule
|
||||
control(F:functions(_,_)) --control-signal(F)-> hole
|
||||
|
||||
|
||||
Funcon
|
||||
delimit-current-continuation(X:=>T) : =>T
|
||||
Alias
|
||||
delimit-cc = delimit-current-continuation
|
||||
/*
|
||||
`delimit-current-continuation(X)` delimits the scope of captured continuations.
|
||||
*/
|
||||
Rule
|
||||
delimit-current-continuation(V:T) ~> V
|
||||
Rule
|
||||
X --control-signal( )-> X'
|
||||
-----------------------------------------------------
|
||||
delimit-current-continuation(X) --control-signal( )->
|
||||
delimit-current-continuation(X')
|
||||
Rule
|
||||
X --control-signal(F)-> X'
|
||||
------------------------------------------------------------------
|
||||
delimit-current-continuation(X) --control-signal( )->
|
||||
delimit-current-continuation(apply(F, continuation closure(X')))
|
||||
131
IBAF-cbs/Funcons-beta/Computations/Abnormal/Controlling/index.md
Normal file
131
IBAF-cbs/Funcons-beta/Computations/Abnormal/Controlling/index.md
Normal file
@@ -0,0 +1,131 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Controlling"
|
||||
parent: Abnormal
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Controlling.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Controlling
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Datatype</i> <span class="name"><a href="#Name_continuations">continuations</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_continuation">continuation</a></span>
|
||||
<i class="keyword">Entity</i> <span class="name"><a href="#Name_plug-signal">plug-signal</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_hole">hole</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_resume-continuation">resume-continuation</a></span>
|
||||
<i class="keyword">Entity</i> <span class="name"><a href="#Name_control-signal">control-signal</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_control">control</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span> <i class="keyword">Alias</i> <span class="name"><a href="#Name_delimit-cc">delimit-cc</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Meta-variables</i>
|
||||
<span id="PartVariable_T"><i class="var">T</i></span>, <span id="PartVariable_T1"><i class="var">T<sub class="sub">1</sub></i></span>, <span id="PartVariable_T2"><i class="var">T<sub class="sub">2</sub></i></span> <: <span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Datatype</i>
|
||||
<span class="name"><span id="Name_continuations">continuations</span></span>(<span id="Variable77_T1"><i class="var">T<sub class="sub">1</sub></i></span>,<span id="Variable84_T2"><i class="var">T<sub class="sub">2</sub></i></span>) ::= <span id="Name_continuation">continuation</span>(_:<span class="name"><a href="../../../Values/Abstraction/Generic/index.html#Name_abstractions">abstractions</a></span>(()=><span id="Variable108_T2"><i class="var">T<sub class="sub">2</sub></i></span>))</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_continuations">continuations</a></span>(<i class="var">T<sub class="sub">1</sub></i>, <i class="var">T<sub class="sub">2</sub></i>)</code> consists of abstractions whose bodies contain a <code><span class="name"><a href="#Name_hole">hole</a></span></code>,
|
||||
and which will normally compute a value of type <code><i class="var">T<sub class="sub">2</sub></i></code> when the <code><span class="name"><a href="#Name_hole">hole</a></span></code> is plugged
|
||||
with a value of type <code><i class="var">T<sub class="sub">1</sub></i></code>.
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Entity</i>
|
||||
_ --<span class="ent-name"><span id="Name_plug-signal">plug-signal</span></span>(<i class="var">V<sup class="sup">?</sup></i>:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span><sup class="sup">?</sup>)-> _</code></pre></div>
|
||||
|
||||
|
||||
A plug-signal contains the value to be filled into a <code><span class="name"><a href="#Name_hole">hole</a></span></code> in a continuation,
|
||||
thereby allowing a continuation to resume.
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_hole">hole</span></span> : =><span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
A <code><span class="name"><a href="#Name_hole">hole</a></span></code> in a term cannot proceed until it receives a plug-signal
|
||||
containing a value to plug the hole.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_hole">hole</a></span> --<span class="ent-name"><a href="#Name_plug-signal">plug-signal</a></span>(<i class="var">V</i>)-> <i class="var">V</i></code></pre></div>
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_resume-continuation">resume-continuation</span></span>(<span id="Variable304_K"><i class="var">K</i></span>:<span class="name"><a href="#Name_continuations">continuations</a></span>(<span id="Variable310_T1"><i class="var">T<sub class="sub">1</sub></i></span>, <span id="Variable316_T2"><i class="var">T<sub class="sub">2</sub></i></span>), <span id="Variable331_V"><i class="var">V</i></span>:<span id="Variable336_T1"><i class="var">T<sub class="sub">1</sub></i></span>) : =><span id="Variable352_T2"><i class="var">T<sub class="sub">2</sub></i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_resume-continuation">resume-continuation</a></span>(<i class="var">K</i>, <i class="var">V</i>)</code> resumes a continuation <code><i class="var">K</i></code> by plugging the value
|
||||
<code><i class="var">V</i></code> into the <code><span class="name"><a href="#Name_hole">hole</a></span></code> in the continuation.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable469_X"><i class="var">X</i></a> --<span class="ent-name"><a href="#Name_plug-signal">plug-signal</a></span>(<span id="Variable437_V"><i class="var">V</i></span>)-> <span id="Variable454_X'"><i class="var">X′</i></span>
|
||||
---------------------------------------------------------------------------
|
||||
<span class="name"><a href="#Name_resume-continuation">resume-continuation</a></span>(<span class="name"><a href="#Name_continuation">continuation</a></span>(<span class="name"><a href="../../../Values/Abstraction/Generic/index.html#Name_abstraction">abstraction</a></span>(<span id="Variable469_X"><i class="var">X</i></span>)), <span id="Variable486_V"><i class="var">V</i></span>:<i class="var">T</i>) --<span class="ent-name"><a href="#Name_plug-signal">plug-signal</a></span>()-> <a href="#Variable454_X'"><i class="var">X′</i></a></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Entity</i>
|
||||
_ --<span class="ent-name"><span id="Name_control-signal">control-signal</span></span>(<i class="var">F<sup class="sup">?</sup></i>:(<span class="name"><a href="../../../Values/Abstraction/Functions/index.html#Name_functions">functions</a></span>(<span class="name"><a href="#Name_continuations">continuations</a></span>(<i class="var">T<sub class="sub">1</sub></i>, <i class="var">T<sub class="sub">2</sub></i>), <i class="var">T<sub class="sub">2</sub></i>))<sup class="sup">?</sup>)-> _</code></pre></div>
|
||||
|
||||
|
||||
A control-signal contains the function to which control is about to be passed
|
||||
by the enclosing <code><span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<i class="var">X</i>)</code>.
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_control">control</span></span>(<span id="Variable606_F"><i class="var">F</i></span>:<span class="name"><a href="../../../Values/Abstraction/Functions/index.html#Name_functions">functions</a></span>(<span class="name"><a href="#Name_continuations">continuations</a></span>(<span id="Variable613_T1"><i class="var">T<sub class="sub">1</sub></i></span>, <span id="Variable619_T2"><i class="var">T<sub class="sub">2</sub></i></span>), <span id="Variable632_T2"><i class="var">T<sub class="sub">2</sub></i></span>)) : =><span id="Variable654_T1"><i class="var">T<sub class="sub">1</sub></i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_control">control</a></span>(<i class="var">F</i>)</code> emits a control-signal that, when handled by an enclosing
|
||||
<code><span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<i class="var">X</i>)</code>, will apply <code><i class="var">F</i></code> to the current continuation of
|
||||
<code><span class="name"><a href="#Name_control">control</a></span>(<i class="var">F</i>)</code>, (rather than proceeding with that current continuation).
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_control">control</a></span>(<span id="Variable743_F"><i class="var">F</i></span>:<span class="name"><a href="../../../Values/Abstraction/Functions/index.html#Name_functions">functions</a></span>(_,_)) --<span class="ent-name"><a href="#Name_control-signal">control-signal</a></span>(<a href="#Variable743_F"><i class="var">F</i></a>)-> <span class="name"><a href="#Name_hole">hole</a></span></code></pre></div>
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_delimit-current-continuation">delimit-current-continuation</span></span>(<span id="Variable797_X"><i class="var">X</i></span>:=><span id="Variable802_T"><i class="var">T</i></span>) : =><span id="Variable817_T"><i class="var">T</i></span>
|
||||
<i class="keyword">Alias</i>
|
||||
<span class="name"><span id="Name_delimit-cc">delimit-cc</span></span> = <span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span></code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<i class="var">X</i>)</code> delimits the scope of captured continuations.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<span id="Variable855_V"><i class="var">V</i></span>:<i class="var">T</i>) ~> <a href="#Variable855_V"><i class="var">V</i></a>
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable913_X"><i class="var">X</i></a> --<span class="ent-name"><a href="#Name_control-signal">control-signal</a></span>( )-> <span id="Variable900_X'"><i class="var">X′</i></span>
|
||||
-----------------------------------------------------
|
||||
<span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<span id="Variable913_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="#Name_control-signal">control-signal</a></span>( )->
|
||||
<span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<a href="#Variable900_X'"><i class="var">X′</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable993_X"><i class="var">X</i></a> --<span class="ent-name"><a href="#Name_control-signal">control-signal</a></span>(<span id="Variable963_F"><i class="var">F</i></span>)-> <span id="Variable980_X'"><i class="var">X′</i></span>
|
||||
------------------------------------------------------------------
|
||||
<span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<span id="Variable993_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="#Name_control-signal">control-signal</a></span>( )->
|
||||
<span class="name"><a href="#Name_delimit-current-continuation">delimit-current-continuation</a></span>(<span class="name"><a href="../../../Values/Abstraction/Functions/index.html#Name_apply">apply</a></span>(<a href="#Variable963_F"><i class="var">F</i></a>, <span class="name"><a href="#Name_continuation">continuation</a></span> <span class="name"><a href="../../../Values/Abstraction/Generic/index.html#Name_closure">closure</a></span>(<a href="#Variable980_X'"><i class="var">X′</i></a>)))</code></pre></div>
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Controlling.cbs]: Controlling.cbs
|
||||
"CBS SOURCE FILE"
|
||||
[Funcons-beta]: /CBS-beta/docs/Funcons-beta
|
||||
"FUNCONS-BETA"
|
||||
[Unstable-Funcons-beta]: /CBS-beta/docs/Unstable-Funcons-beta
|
||||
"UNSTABLE-FUNCONS-BETA"
|
||||
[Languages-beta]: /CBS-beta/docs/Languages-beta
|
||||
"LANGUAGES-BETA"
|
||||
[Unstable-Languages-beta]: /CBS-beta/docs/Unstable-Languages-beta
|
||||
"UNSTABLE-LANGUAGES-BETA"
|
||||
[CBS-beta]: /CBS-beta "CBS-BETA"
|
||||
[PLanCompS Project]: https://plancomps.github.io
|
||||
"PROGRAMMING LANGUAGE COMPONENTS AND SPECIFICATIONS PROJECT HOME PAGE"
|
||||
[CBS-beta issues...]: https://github.com/plancomps/CBS-beta/issues
|
||||
"CBS-BETA ISSUE REPORTS ON GITHUB"
|
||||
[Suggest an improvement...]: mailto:plancomps@gmail.com?Subject=CBS-beta%20-%20comment&Body=Re%3A%20CBS-beta%20specification%20at%20Computations/Abnormal/Controlling/Controlling.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
108
IBAF-cbs/Funcons-beta/Computations/Abnormal/Failing/Failing.cbs
Normal file
108
IBAF-cbs/Funcons-beta/Computations/Abnormal/Failing/Failing.cbs
Normal file
@@ -0,0 +1,108 @@
|
||||
### Failing
|
||||
|
||||
[
|
||||
Datatype failing
|
||||
Funcon failed
|
||||
Funcon finalise-failing
|
||||
Funcon fail
|
||||
Funcon else
|
||||
Funcon else-choice
|
||||
Funcon checked
|
||||
Funcon check-true
|
||||
]
|
||||
|
||||
|
||||
Meta-variables
|
||||
T <: values
|
||||
|
||||
|
||||
Datatype
|
||||
failing ::= failed
|
||||
/*
|
||||
`failed` is a reason for abrupt termination.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
finalise-failing(X:=>T) : =>T|null-type
|
||||
~> finalise-abrupting(X)
|
||||
/*
|
||||
`finalise-failing(X)` handles abrupt termination of `X` due to executing `fail`.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
fail : =>empty-type
|
||||
~> abrupt(failed)
|
||||
/*
|
||||
`fail` abruptly terminates all enclosing computations until it is handled.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
else(_:=>T, _:(=>T)+) : =>T
|
||||
/*
|
||||
`else(X1, X2, ...)` executes the arguments in turn until either some
|
||||
`Xi` does *not* fail, or all arguments `Xi` have been executed.
|
||||
The last argument executed determines the result.
|
||||
`else(X, Y)` is associative, with unit `fail`.
|
||||
*/
|
||||
Rule
|
||||
X --abrupted( )-> X'
|
||||
--------------------------------------
|
||||
else(X, Y) --abrupted( )-> else(X', Y)
|
||||
Rule
|
||||
X --abrupted(failed)-> _
|
||||
---------------------------------
|
||||
else(X, Y) --abrupted( )-> Y
|
||||
Rule
|
||||
X --abrupted(V:~failing)-> X'
|
||||
--------------------------------------
|
||||
else(X, Y) --abrupted(V)-> else(X', Y)
|
||||
Rule
|
||||
else(V:T, Y) ~> V
|
||||
Rule
|
||||
else(X, Y, Z+) ~> else(X, else(Y, Z+))
|
||||
|
||||
|
||||
Funcon
|
||||
else-choice(_:(=>T)+) : =>T
|
||||
/*
|
||||
`else-choice(X,...)` executes the arguments in any order until either some
|
||||
`Xi` does *not* fail, or all arguments `Xi` have been executed.
|
||||
The last argument executed determines the result.
|
||||
`else(X, Y)` is associative and commutative, with unit `fail`.
|
||||
*/
|
||||
Rule
|
||||
else-choice(W*, X, Y, Z*)
|
||||
~> choice(else(X, else-choice(W*, Y, Z*),
|
||||
else(Y, else-choice(W*, X, Z*))))
|
||||
Rule
|
||||
else-choice(X) ~> X
|
||||
|
||||
|
||||
Funcon
|
||||
check-true(_:booleans) : =>null-type
|
||||
Alias
|
||||
check = check-true
|
||||
/*
|
||||
`check-true(X)` terminates normally if the value computed by `X` is `true`,
|
||||
and fails if it is `false`.
|
||||
*/
|
||||
Rule
|
||||
check-true(true) ~> null-value
|
||||
Rule
|
||||
check-true(false) ~> fail
|
||||
|
||||
|
||||
Funcon
|
||||
checked(_:(T)?) : =>T
|
||||
/*
|
||||
`checked(X)` fails when `X` gives the empty sequence of values `( )`,
|
||||
representing that an optional value has not been computed. It otherwise
|
||||
computes the same as `X`.
|
||||
*/
|
||||
Rule
|
||||
checked(V:T) ~> V
|
||||
Rule
|
||||
checked( ) ~> fail
|
||||
149
IBAF-cbs/Funcons-beta/Computations/Abnormal/Failing/index.md
Normal file
149
IBAF-cbs/Funcons-beta/Computations/Abnormal/Failing/index.md
Normal file
@@ -0,0 +1,149 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Failing"
|
||||
parent: Abnormal
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Failing.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Failing
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Datatype</i> <span class="name"><a href="#Name_failing">failing</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_failed">failed</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_finalise-failing">finalise-failing</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_fail">fail</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_else">else</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_else-choice">else-choice</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_checked">checked</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_check-true">check-true</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Meta-variables</i>
|
||||
<span id="PartVariable_T"><i class="var">T</i></span> <: <span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Datatype</i>
|
||||
<span class="name"><span id="Name_failing">failing</span></span> ::= <span id="Name_failed">failed</span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_failed">failed</a></span></code> is a reason for abrupt termination.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_finalise-failing">finalise-failing</span></span>(<span id="Variable88_X"><i class="var">X</i></span>:=><span id="Variable93_T"><i class="var">T</i></span>) : =><span id="Variable108_T"><i class="var">T</i></span>|<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_finalise-abrupting">finalise-abrupting</a></span>(<a href="#Variable88_X"><i class="var">X</i></a>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_finalise-failing">finalise-failing</a></span>(<i class="var">X</i>)</code> handles abrupt termination of <code><i class="var">X</i></code> due to executing <code><span class="name"><a href="#Name_fail">fail</a></span></code>.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_fail">fail</span></span> : =><span class="name"><a href="../../../Values/Value-Types/index.html#Name_empty-type">empty-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_abrupt">abrupt</a></span>(<span class="name"><a href="#Name_failed">failed</a></span>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_fail">fail</a></span></code> abruptly terminates all enclosing computations until it is handled.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_else">else</span></span>(_:=><span id="Variable220_T"><i class="var">T</i></span>, _:(=><span id="Variable233_T"><i class="var">T</i></span>)<sup class="sup">+</sup>) : =><span id="Variable256_T"><i class="var">T</i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_else">else</a></span>(<i class="var">X<sub class="sub">1</sub></i>, <i class="var">X<sub class="sub">2</sub></i>, ...)</code> executes the arguments in turn until either some
|
||||
<code><i class="var">Xi</i></code> does *not* fail, or all arguments <code><i class="var">Xi</i></code> have been executed.
|
||||
The last argument executed determines the result.
|
||||
<code><span class="name"><a href="#Name_else">else</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> is associative, with unit <code><span class="name"><a href="#Name_fail">fail</a></span></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable409_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span id="Variable396_X'"><i class="var">X′</i></span>
|
||||
--------------------------------------
|
||||
<span class="name"><a href="#Name_else">else</a></span>(<span id="Variable409_X"><i class="var">X</i></span>, <span id="Variable414_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="#Name_else">else</a></span>(<a href="#Variable396_X'"><i class="var">X′</i></a>, <a href="#Variable414_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable496_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span class="name"><a href="#Name_failed">failed</a></span>)-> _
|
||||
---------------------------------
|
||||
<span class="name"><a href="#Name_else">else</a></span>(<span id="Variable496_X"><i class="var">X</i></span>, <span id="Variable501_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <a href="#Variable501_Y"><i class="var">Y</i></a>
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable578_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span id="Variable544_V"><i class="var">V</i></span>:~<span class="name"><a href="#Name_failing">failing</a></span>)-> <span id="Variable565_X'"><i class="var">X′</i></span>
|
||||
--------------------------------------
|
||||
<span class="name"><a href="#Name_else">else</a></span>(<span id="Variable578_X"><i class="var">X</i></span>, <span id="Variable583_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<a href="#Variable544_V"><i class="var">V</i></a>)-> <span class="name"><a href="#Name_else">else</a></span>(<a href="#Variable565_X'"><i class="var">X′</i></a>, <a href="#Variable583_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_else">else</a></span>(<span id="Variable638_V"><i class="var">V</i></span>:<i class="var">T</i>, <span id="Variable649_Y"><i class="var">Y</i></span>) ~> <a href="#Variable638_V"><i class="var">V</i></a>
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_else">else</a></span>(<span id="Variable670_X"><i class="var">X</i></span>, <span id="Variable675_Y"><i class="var">Y</i></span>, <span id="Variable681_Z+"><i class="var">Z<sup class="sup">+</sup></i></span>) ~> <span class="name"><a href="#Name_else">else</a></span>(<a href="#Variable670_X"><i class="var">X</i></a>, <span class="name"><a href="#Name_else">else</a></span>(<a href="#Variable675_Y"><i class="var">Y</i></a>, <a href="#Variable681_Z+"><i class="var">Z<sup class="sup">+</sup></i></a>))</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_else-choice">else-choice</span></span>(_:(=><span id="Variable734_T"><i class="var">T</i></span>)<sup class="sup">+</sup>) : =><span id="Variable756_T"><i class="var">T</i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_else-choice">else-choice</a></span>(<i class="var">X</i>,...)</code> executes the arguments in any order until either some
|
||||
<code><i class="var">Xi</i></code> does *not* fail, or all arguments <code><i class="var">Xi</i></code> have been executed.
|
||||
The last argument executed determines the result.
|
||||
<code><span class="name"><a href="#Name_else">else</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> is associative and commutative, with unit <code><span class="name"><a href="#Name_fail">fail</a></span></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_else-choice">else-choice</a></span>(<span id="Variable870_W*"><i class="var">W<sup class="sup">*</sup></i></span>, <span id="Variable875_X"><i class="var">X</i></span>, <span id="Variable880_Y"><i class="var">Y</i></span>, <span id="Variable886_Z*"><i class="var">Z<sup class="sup">*</sup></i></span>)
|
||||
~> <span class="name"><a href="../../Normal/Flowing/index.html#Name_choice">choice</a></span>(<span class="name"><a href="#Name_else">else</a></span>(<a href="#Variable875_X"><i class="var">X</i></a>, <span class="name"><a href="#Name_else-choice">else-choice</a></span>(<a href="#Variable870_W*"><i class="var">W<sup class="sup">*</sup></i></a>, <a href="#Variable880_Y"><i class="var">Y</i></a>, <a href="#Variable886_Z*"><i class="var">Z<sup class="sup">*</sup></i></a>),
|
||||
<span class="name"><a href="#Name_else">else</a></span>(<a href="#Variable880_Y"><i class="var">Y</i></a>, <span class="name"><a href="#Name_else-choice">else-choice</a></span>(<a href="#Variable870_W*"><i class="var">W<sup class="sup">*</sup></i></a>, <a href="#Variable875_X"><i class="var">X</i></a>, <a href="#Variable886_Z*"><i class="var">Z<sup class="sup">*</sup></i></a>))))
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_else-choice">else-choice</a></span>(<span id="Variable990_X"><i class="var">X</i></span>) ~> <a href="#Variable990_X"><i class="var">X</i></a></code></pre></div>
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_check-true">check-true</span></span>(_:<span class="name"><a href="../../../Values/Primitive/Booleans/index.html#Name_booleans">booleans</a></span>) : =><span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>
|
||||
<i class="keyword">Alias</i>
|
||||
<span class="name"><span id="Name_check">check</span></span> = <span class="name"><a href="#Name_check-true">check-true</a></span></code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_check-true">check-true</a></span>(<i class="var">X</i>)</code> terminates normally if the value computed by <code><i class="var">X</i></code> is <code><span class="name"><a href="../../../Values/Primitive/Booleans/index.html#Name_true">true</a></span></code>,
|
||||
and fails if it is <code><span class="name"><a href="../../../Values/Primitive/Booleans/index.html#Name_false">false</a></span></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_check-true">check-true</a></span>(<span class="name"><a href="../../../Values/Primitive/Booleans/index.html#Name_true">true</a></span>) ~> <span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span>
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_check-true">check-true</a></span>(<span class="name"><a href="../../../Values/Primitive/Booleans/index.html#Name_false">false</a></span>) ~> <span class="name"><a href="#Name_fail">fail</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_checked">checked</span></span>(_:(<span id="Variable1123_T"><i class="var">T</i></span>)<sup class="sup">?</sup>) : =><span id="Variable1144_T"><i class="var">T</i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_checked">checked</a></span>(<i class="var">X</i>)</code> fails when <code><i class="var">X</i></code> gives the empty sequence of values <code>( )</code>,
|
||||
representing that an optional value has not been computed. It otherwise
|
||||
computes the same as <code><i class="var">X</i></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_checked">checked</a></span>(<span id="Variable1217_V"><i class="var">V</i></span>:<i class="var">T</i>) ~> <a href="#Variable1217_V"><i class="var">V</i></a>
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_checked">checked</a></span>( ) ~> <span class="name"><a href="#Name_fail">fail</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Failing.cbs]: Failing.cbs
|
||||
"CBS SOURCE FILE"
|
||||
[Funcons-beta]: /CBS-beta/docs/Funcons-beta
|
||||
"FUNCONS-BETA"
|
||||
[Unstable-Funcons-beta]: /CBS-beta/docs/Unstable-Funcons-beta
|
||||
"UNSTABLE-FUNCONS-BETA"
|
||||
[Languages-beta]: /CBS-beta/docs/Languages-beta
|
||||
"LANGUAGES-BETA"
|
||||
[Unstable-Languages-beta]: /CBS-beta/docs/Unstable-Languages-beta
|
||||
"UNSTABLE-LANGUAGES-BETA"
|
||||
[CBS-beta]: /CBS-beta "CBS-BETA"
|
||||
[PLanCompS Project]: https://plancomps.github.io
|
||||
"PROGRAMMING LANGUAGE COMPONENTS AND SPECIFICATIONS PROJECT HOME PAGE"
|
||||
[CBS-beta issues...]: https://github.com/plancomps/CBS-beta/issues
|
||||
"CBS-BETA ISSUE REPORTS ON GITHUB"
|
||||
[Suggest an improvement...]: mailto:plancomps@gmail.com?Subject=CBS-beta%20-%20comment&Body=Re%3A%20CBS-beta%20specification%20at%20Computations/Abnormal/Failing/Failing.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
@@ -0,0 +1,16 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-failing
|
||||
sequential(
|
||||
check-true(true), print 1,
|
||||
else(check-true(false), print 2),
|
||||
check-true(not false), print 3,
|
||||
print sequential(check-true(true),4)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, 4];
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-failing
|
||||
sequential(
|
||||
effect(checked(true)), print 1,
|
||||
else(effect(checked()), print 2),
|
||||
else(effect(checked(map-lookup(map(),1))), print 3),
|
||||
print(checked(map-lookup(map(tuple(0,1),tuple(1,4)),1)))
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, 4];
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-failing
|
||||
sequential(
|
||||
effect(checked(42)), print 1,
|
||||
else(checked(sequential(print(2),lookup(map-empty,"x"))), print 3)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3];
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-failing finalise-abrupting
|
||||
sequential(
|
||||
else-choice(print 1),
|
||||
else-choice(fail, fail, fail, print 2, fail, print 3)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2];
|
||||
// Also possible:
|
||||
// standard-out: [1, 3];
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-failing finalise-abrupting
|
||||
sequential(
|
||||
else(fail, print 1),
|
||||
print else(2, fail),
|
||||
else(print 3, fail),
|
||||
handle-abrupt(
|
||||
else(abrupt(true), print 99),
|
||||
print 4),
|
||||
else(fail, fail, print 5)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, 4, 5];
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
### Returning
|
||||
|
||||
[
|
||||
Datatype returning
|
||||
Funcon returned
|
||||
Funcon finalise-returning
|
||||
Funcon return
|
||||
Funcon handle-return
|
||||
]
|
||||
|
||||
|
||||
Meta-variables
|
||||
T <: values
|
||||
|
||||
|
||||
Datatype
|
||||
returning ::= returned(_:values)
|
||||
/*
|
||||
`returned(V?)` is a reason for abrupt termination.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
finalise-returning(X:=>T) : =>T|null-type
|
||||
~> finalise-abrupting(X)
|
||||
/*
|
||||
`finalise-returning(X)` handles abrupt termination of `X` due to
|
||||
executing `return(V)`.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
return(V:T) : =>empty-type
|
||||
~> abrupt(returned(V))
|
||||
/*
|
||||
`return(V)` abruptly terminates all enclosing computations until it is
|
||||
handled, then giving `V`. Note that `V` may be `null-value`.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
handle-return(_:=>T) : =>T
|
||||
/*
|
||||
`handle-return(X)` first evaluates `X`. If `X` either terminates abruptly for
|
||||
reason `returned(V)`, or terminates normally with value `V`, it gives `V`.
|
||||
*/
|
||||
Rule
|
||||
X --abrupted( )-> X'
|
||||
--------------------------------------------------
|
||||
handle-return(X) --abrupted( )-> handle-return(X')
|
||||
Rule
|
||||
X --abrupted(returned(V:values))-> X'
|
||||
----------------------------------------------
|
||||
handle-return(X) --abrupted( )-> V
|
||||
Rule
|
||||
X --abrupted(V':~returning)-> X'
|
||||
---------------------------------------------------
|
||||
handle-return(X) --abrupted(V')-> handle-return(X')
|
||||
Rule
|
||||
handle-return(V:T) ~> V
|
||||
100
IBAF-cbs/Funcons-beta/Computations/Abnormal/Returning/index.md
Normal file
100
IBAF-cbs/Funcons-beta/Computations/Abnormal/Returning/index.md
Normal file
@@ -0,0 +1,100 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Returning"
|
||||
parent: Abnormal
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Returning.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Returning
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Datatype</i> <span class="name"><a href="#Name_returning">returning</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_returned">returned</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_finalise-returning">finalise-returning</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_return">return</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_handle-return">handle-return</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Meta-variables</i>
|
||||
<span id="PartVariable_T"><i class="var">T</i></span> <: <span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Datatype</i>
|
||||
<span class="name"><span id="Name_returning">returning</span></span> ::= <span id="Name_returned">returned</span>(_:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_returned">returned</a></span>(<i class="var">V<sup class="sup">?</sup></i>)</code> is a reason for abrupt termination.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_finalise-returning">finalise-returning</span></span>(<span id="Variable99_X"><i class="var">X</i></span>:=><span id="Variable104_T"><i class="var">T</i></span>) : =><span id="Variable119_T"><i class="var">T</i></span>|<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_finalise-abrupting">finalise-abrupting</a></span>(<a href="#Variable99_X"><i class="var">X</i></a>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_finalise-returning">finalise-returning</a></span>(<i class="var">X</i>)</code> handles abrupt termination of <code><i class="var">X</i></code> due to
|
||||
executing <code><span class="name"><a href="#Name_return">return</a></span>(<i class="var">V</i>)</code>.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_return">return</span></span>(<span id="Variable203_V"><i class="var">V</i></span>:<span id="Variable207_T"><i class="var">T</i></span>) : =><span class="name"><a href="../../../Values/Value-Types/index.html#Name_empty-type">empty-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_abrupt">abrupt</a></span>(<span class="name"><a href="#Name_returned">returned</a></span>(<a href="#Variable203_V"><i class="var">V</i></a>))</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_return">return</a></span>(<i class="var">V</i>)</code> abruptly terminates all enclosing computations until it is
|
||||
handled, then giving <code><i class="var">V</i></code>. Note that <code><i class="var">V</i></code> may be <code><span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-value">null-value</a></span></code>.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_handle-return">handle-return</span></span>(_:=><span id="Variable313_T"><i class="var">T</i></span>) : =><span id="Variable328_T"><i class="var">T</i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-return">handle-return</a></span>(<i class="var">X</i>)</code> first evaluates <code><i class="var">X</i></code>. If <code><i class="var">X</i></code> either terminates abruptly for
|
||||
reason <code><span class="name"><a href="#Name_returned">returned</a></span>(<i class="var">V</i>)</code>, or terminates normally with value <code><i class="var">V</i></code>, it gives <code><i class="var">V</i></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable467_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span id="Variable454_X'"><i class="var">X′</i></span>
|
||||
--------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-return">handle-return</a></span>(<span id="Variable467_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="#Name_handle-return">handle-return</a></span>(<a href="#Variable454_X'"><i class="var">X′</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable557_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span class="name"><a href="#Name_returned">returned</a></span>(<span id="Variable518_V"><i class="var">V</i></span>:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>))-> <span id="Variable544_X'"><i class="var">X′</i></span>
|
||||
----------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-return">handle-return</a></span>(<span id="Variable557_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <a href="#Variable518_V"><i class="var">V</i></a>
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable634_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span id="Variable600_V'"><i class="var">V′</i></span>:~<span class="name"><a href="#Name_returning">returning</a></span>)-> <span id="Variable621_X'"><i class="var">X′</i></span>
|
||||
---------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-return">handle-return</a></span>(<span id="Variable634_X"><i class="var">X</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<a href="#Variable600_V'"><i class="var">V′</i></a>)-> <span class="name"><a href="#Name_handle-return">handle-return</a></span>(<a href="#Variable621_X'"><i class="var">X′</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_handle-return">handle-return</a></span>(<span id="Variable683_V"><i class="var">V</i></span>:<i class="var">T</i>) ~> <a href="#Variable683_V"><i class="var">V</i></a></code></pre></div>
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Returning.cbs]: Returning.cbs
|
||||
"CBS SOURCE FILE"
|
||||
[Funcons-beta]: /CBS-beta/docs/Funcons-beta
|
||||
"FUNCONS-BETA"
|
||||
[Unstable-Funcons-beta]: /CBS-beta/docs/Unstable-Funcons-beta
|
||||
"UNSTABLE-FUNCONS-BETA"
|
||||
[Languages-beta]: /CBS-beta/docs/Languages-beta
|
||||
"LANGUAGES-BETA"
|
||||
[Unstable-Languages-beta]: /CBS-beta/docs/Unstable-Languages-beta
|
||||
"UNSTABLE-LANGUAGES-BETA"
|
||||
[CBS-beta]: /CBS-beta "CBS-BETA"
|
||||
[PLanCompS Project]: https://plancomps.github.io
|
||||
"PROGRAMMING LANGUAGE COMPONENTS AND SPECIFICATIONS PROJECT HOME PAGE"
|
||||
[CBS-beta issues...]: https://github.com/plancomps/CBS-beta/issues
|
||||
"CBS-BETA ISSUE REPORTS ON GITHUB"
|
||||
[Suggest an improvement...]: mailto:plancomps@gmail.com?Subject=CBS-beta%20-%20comment&Body=Re%3A%20CBS-beta%20specification%20at%20Computations/Abnormal/Returning/Returning.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
@@ -0,0 +1,16 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-returning
|
||||
sequential(
|
||||
print handle-return(1),
|
||||
handle-return(print 2),
|
||||
print handle-return(
|
||||
sequential(print 3, return(sequential(print 4, 5))))
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, 4, 5];
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
### Throwing
|
||||
|
||||
[
|
||||
Datatype throwing
|
||||
Funcon thrown
|
||||
Funcon finalise-throwing
|
||||
Funcon throw
|
||||
Funcon handle-thrown
|
||||
Funcon handle-recursively
|
||||
Funcon catch-else-throw
|
||||
]
|
||||
|
||||
|
||||
Meta-variables
|
||||
R, S, T, T', T'' <: values
|
||||
|
||||
|
||||
Datatype
|
||||
throwing ::= thrown(_:values)
|
||||
/*
|
||||
`thrown(V)` is a reason for abrupt termination.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
finalise-throwing(X:=>T) : =>T|null-type
|
||||
~> finalise-abrupting(X)
|
||||
/*
|
||||
`finalise-throwing(X)` handles abrupt termination of `X` due to
|
||||
executing `throw(V)`.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
throw(V:T) : =>empty-type
|
||||
~> abrupt(thrown(V))
|
||||
/*
|
||||
`throw(V)` abruptly terminates all enclosing computations uTil it is handled.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
handle-thrown(_:T'=>T, _:T''=>T) : T'=>T
|
||||
/*
|
||||
`handle-thrown(X, Y)` first evaluates `X`. If `X` terminates normally with
|
||||
value `V`, then `V` is returned and `Y` is ignored. If `X` terminates abruptly
|
||||
with a thrown eTity having value `V`, then `Y` is executed with `V` as
|
||||
`given` value.
|
||||
|
||||
`handle-thrown(X, Y)` is associative, with `throw(given)` as unit.
|
||||
`handle-thrown(X, else(Y, throw(given)))` ensures that if `Y` fails, the
|
||||
thrown value is re-thrown.
|
||||
*/
|
||||
Rule
|
||||
X --abrupted( )-> X'
|
||||
--------------------------------------------------------
|
||||
handle-thrown(X, Y) --abrupted( )-> handle-thrown(X', Y)
|
||||
Rule
|
||||
X --abrupted(thrown(V'':values))-> X'
|
||||
----------------------------------------------
|
||||
handle-thrown(X, Y) --abrupted( )-> give(V'', Y)
|
||||
Rule
|
||||
X --abrupted(V':~throwing)-> X'
|
||||
---------------------------------------------------------
|
||||
handle-thrown(X, Y) --abrupted(V')-> handle-thrown(X', Y)
|
||||
Rule
|
||||
handle-thrown(V:T, Y) ~> V
|
||||
|
||||
|
||||
Funcon
|
||||
handle-recursively(X:S=>T, Y:R=>T) : S=>T
|
||||
~> handle-thrown(X, else(handle-recursively(Y, Y), throw(given)))
|
||||
/*
|
||||
`handle-recursively(X, Y)` behaves similarly to `handle-thrown(X, Y)`, except
|
||||
that another copy of the handler attempts to handle any values thrown by `Y`.
|
||||
Thus, many thrown values may get handled by the same handler.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
catch-else-throw(P:values, Y:=>T) : =>T
|
||||
~> else(case-match(P, Y), throw(given))
|
||||
/*
|
||||
`handle-thrown(X, catch-else-throw(P, Y))` handles those values thrown by `X`
|
||||
that match pattern `P`. Other thrown values are re-thrown.
|
||||
*/
|
||||
128
IBAF-cbs/Funcons-beta/Computations/Abnormal/Throwing/index.md
Normal file
128
IBAF-cbs/Funcons-beta/Computations/Abnormal/Throwing/index.md
Normal file
@@ -0,0 +1,128 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Throwing"
|
||||
parent: Abnormal
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Throwing.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Throwing
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Datatype</i> <span class="name"><a href="#Name_throwing">throwing</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_thrown">thrown</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_finalise-throwing">finalise-throwing</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_throw">throw</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_handle-recursively">handle-recursively</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_catch-else-throw">catch-else-throw</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Meta-variables</i>
|
||||
<span id="PartVariable_R"><i class="var">R</i></span>, <span id="PartVariable_S"><i class="var">S</i></span>, <span id="PartVariable_T"><i class="var">T</i></span>, <span id="PartVariable_T'"><i class="var">T′</i></span>, <span id="PartVariable_T''"><i class="var">T′′</i></span> <: <span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Datatype</i>
|
||||
<span class="name"><span id="Name_throwing">throwing</span></span> ::= <span id="Name_thrown">thrown</span>(_:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_thrown">thrown</a></span>(<i class="var">V</i>)</code> is a reason for abrupt termination.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_finalise-throwing">finalise-throwing</span></span>(<span id="Variable128_X"><i class="var">X</i></span>:=><span id="Variable133_T"><i class="var">T</i></span>) : =><span id="Variable148_T"><i class="var">T</i></span>|<span class="name"><a href="../../../Values/Primitive/Null/index.html#Name_null-type">null-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_finalise-abrupting">finalise-abrupting</a></span>(<a href="#Variable128_X"><i class="var">X</i></a>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_finalise-throwing">finalise-throwing</a></span>(<i class="var">X</i>)</code> handles abrupt termination of <code><i class="var">X</i></code> due to
|
||||
executing <code><span class="name"><a href="#Name_throw">throw</a></span>(<i class="var">V</i>)</code>.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_throw">throw</span></span>(<span id="Variable232_V"><i class="var">V</i></span>:<span id="Variable236_T"><i class="var">T</i></span>) : =><span class="name"><a href="../../../Values/Value-Types/index.html#Name_empty-type">empty-type</a></span>
|
||||
~> <span class="name"><a href="../Abrupting/index.html#Name_abrupt">abrupt</a></span>(<span class="name"><a href="#Name_thrown">thrown</a></span>(<a href="#Variable232_V"><i class="var">V</i></a>))</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_throw">throw</a></span>(<i class="var">V</i>)</code> abruptly terminates all enclosing computations uTil it is handled.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_handle-thrown">handle-thrown</span></span>(_:<span id="Variable306_T'"><i class="var">T′</i></span>=><span id="Variable312_T"><i class="var">T</i></span>, _:<span id="Variable325_T''"><i class="var">T′′</i></span>=><span id="Variable331_T"><i class="var">T</i></span>) : <span id="Variable347_T'"><i class="var">T′</i></span>=><span id="Variable353_T"><i class="var">T</i></span></code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> first evaluates <code><i class="var">X</i></code>. If <code><i class="var">X</i></code> terminates normally with
|
||||
value <code><i class="var">V</i></code>, then <code><i class="var">V</i></code> is returned and <code><i class="var">Y</i></code> is ignored. If <code><i class="var">X</i></code> terminates abruptly
|
||||
with a thrown eTity having value <code><i class="var">V</i></code>, then <code><i class="var">Y</i></code> is executed with <code><i class="var">V</i></code> as
|
||||
<code><span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span></code> value.
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> is associative, with <code><span class="name"><a href="#Name_throw">throw</a></span>(<span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span>)</code> as unit.
|
||||
<code><span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<i class="var">X</i>, <span class="name"><a href="../Failing/index.html#Name_else">else</a></span>(<i class="var">Y</i>, <span class="name"><a href="#Name_throw">throw</a></span>(<span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span>)))</code> ensures that if <code><i class="var">Y</i></code> fails, the
|
||||
thrown value is re-thrown.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<a href="#Variable652_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span id="Variable639_X'"><i class="var">X′</i></span>
|
||||
--------------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<span id="Variable652_X"><i class="var">X</i></span>, <span id="Variable657_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<a href="#Variable639_X'"><i class="var">X′</i></a>, <a href="#Variable657_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable755_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span class="name"><a href="#Name_thrown">thrown</a></span>(<span id="Variable716_V''"><i class="var">V′′</i></span>:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>))-> <span id="Variable742_X'"><i class="var">X′</i></span>
|
||||
----------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<span id="Variable755_X"><i class="var">X</i></span>, <span id="Variable760_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>( )-> <span class="name"><a href="../../Normal/Giving/index.html#Name_give">give</a></span>(<a href="#Variable716_V''"><i class="var">V′′</i></a>, <a href="#Variable760_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<a href="#Variable852_X"><i class="var">X</i></a> --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<span id="Variable818_V'"><i class="var">V′</i></span>:~<span class="name"><a href="#Name_throwing">throwing</a></span>)-> <span id="Variable839_X'"><i class="var">X′</i></span>
|
||||
---------------------------------------------------------
|
||||
<span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<span id="Variable852_X"><i class="var">X</i></span>, <span id="Variable857_Y"><i class="var">Y</i></span>) --<span class="ent-name"><a href="../Abrupting/index.html#Name_abrupted">abrupted</a></span>(<a href="#Variable818_V'"><i class="var">V′</i></a>)-> <span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<a href="#Variable839_X'"><i class="var">X′</i></a>, <a href="#Variable857_Y"><i class="var">Y</i></a>)
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<span id="Variable913_V"><i class="var">V</i></span>:<i class="var">T</i>, <span id="Variable924_Y"><i class="var">Y</i></span>) ~> <a href="#Variable913_V"><i class="var">V</i></a></code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_handle-recursively">handle-recursively</span></span>(<span id="Variable945_X"><i class="var">X</i></span>:<span id="Variable949_S"><i class="var">S</i></span>=><span id="Variable955_T"><i class="var">T</i></span>, <span id="Variable964_Y"><i class="var">Y</i></span>:<span id="Variable968_R"><i class="var">R</i></span>=><span id="Variable974_T"><i class="var">T</i></span>) : <span id="Variable989_S"><i class="var">S</i></span>=><span id="Variable995_T"><i class="var">T</i></span>
|
||||
~> <span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<a href="#Variable945_X"><i class="var">X</i></a>, <span class="name"><a href="../Failing/index.html#Name_else">else</a></span>(<span class="name"><a href="#Name_handle-recursively">handle-recursively</a></span>(<a href="#Variable964_Y"><i class="var">Y</i></a>, <a href="#Variable964_Y"><i class="var">Y</i></a>), <span class="name"><a href="#Name_throw">throw</a></span>(<span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span>)))</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-recursively">handle-recursively</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code> behaves similarly to <code><span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<i class="var">X</i>, <i class="var">Y</i>)</code>, except
|
||||
that another copy of the handler attempts to handle any values thrown by <code><i class="var">Y</i></code>.
|
||||
Thus, many thrown values may get handled by the same handler.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_catch-else-throw">catch-else-throw</span></span>(<span id="Variable1124_P"><i class="var">P</i></span>:<span class="name"><a href="../../../Values/Value-Types/index.html#Name_values">values</a></span>, <span id="Variable1133_Y"><i class="var">Y</i></span>:=><span id="Variable1138_T"><i class="var">T</i></span>) : =><span id="Variable1154_T"><i class="var">T</i></span>
|
||||
~> <span class="name"><a href="../Failing/index.html#Name_else">else</a></span>(<span class="name"><a href="../../../Values/Abstraction/Patterns/index.html#Name_case-match">case-match</a></span>(<a href="#Variable1124_P"><i class="var">P</i></a>, <a href="#Variable1133_Y"><i class="var">Y</i></a>), <span class="name"><a href="#Name_throw">throw</a></span>(<span class="name"><a href="../../Normal/Giving/index.html#Name_given">given</a></span>))</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<i class="var">X</i>, <span class="name"><a href="#Name_catch-else-throw">catch-else-throw</a></span>(<i class="var">P</i>, <i class="var">Y</i>))</code> handles those values thrown by <code><i class="var">X</i></code>
|
||||
that match pattern <code><i class="var">P</i></code>. Other thrown values are re-thrown.
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Throwing.cbs]: Throwing.cbs
|
||||
"CBS SOURCE FILE"
|
||||
[Funcons-beta]: /CBS-beta/docs/Funcons-beta
|
||||
"FUNCONS-BETA"
|
||||
[Unstable-Funcons-beta]: /CBS-beta/docs/Unstable-Funcons-beta
|
||||
"UNSTABLE-FUNCONS-BETA"
|
||||
[Languages-beta]: /CBS-beta/docs/Languages-beta
|
||||
"LANGUAGES-BETA"
|
||||
[Unstable-Languages-beta]: /CBS-beta/docs/Unstable-Languages-beta
|
||||
"UNSTABLE-LANGUAGES-BETA"
|
||||
[CBS-beta]: /CBS-beta "CBS-BETA"
|
||||
[PLanCompS Project]: https://plancomps.github.io
|
||||
"PROGRAMMING LANGUAGE COMPONENTS AND SPECIFICATIONS PROJECT HOME PAGE"
|
||||
[CBS-beta issues...]: https://github.com/plancomps/CBS-beta/issues
|
||||
"CBS-BETA ISSUE REPORTS ON GITHUB"
|
||||
[Suggest an improvement...]: mailto:plancomps@gmail.com?Subject=CBS-beta%20-%20comment&Body=Re%3A%20CBS-beta%20specification%20at%20Computations/Abnormal/Throwing/Throwing.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
@@ -0,0 +1,19 @@
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-binding
|
||||
finalise-throwing
|
||||
sequential(
|
||||
handle-thrown(
|
||||
throw 1,
|
||||
catch-else-throw(1, print 1)),
|
||||
handle-thrown(
|
||||
handle-thrown(throw 2,
|
||||
catch-else-throw(1, fail)),
|
||||
catch-else-throw(2, print 2)))
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2];
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-throwing
|
||||
handle-recursively(
|
||||
throw 1,
|
||||
if-true-else(
|
||||
is-less(given,4),
|
||||
sequential(print given, throw integer-add(1,given)),
|
||||
print"OK")
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, "OK"];
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
general {
|
||||
funcon-term:
|
||||
finalise-throwing
|
||||
sequential(
|
||||
print handle-thrown(1, fail),
|
||||
handle-thrown(print 2, fail),
|
||||
handle-thrown(
|
||||
sequential(print 3, throw(sequential(print 4, 5))),
|
||||
print given)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [1, 2, 3, 4, 5];
|
||||
}
|
||||
Reference in New Issue
Block a user