init commit again

This commit is contained in:
Peter
2023-11-01 09:29:33 +01:00
parent 448147e7da
commit d6c745207b
250 changed files with 15552 additions and 1 deletions

View File

@@ -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)

View 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&prime;</i></span>, <span id="PartVariable_T''"><i class="var">T&prime;&prime;</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&prime;</i></span>=><span id="Variable350_T"><i class="var">T</i></span>, _:<span id="Variable363_T''"><i class="var">T&prime;&prime;</i></span>=><span id="Variable369_T"><i class="var">T</i></span>) : <span id="Variable385_T'"><i class="var">T&prime;</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&prime;</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&prime;</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&prime;&prime;</i>)-> <span id="Variable776_X'"><i class="var">X&prime;</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&prime;</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&prime;</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&prime;</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"

View File

@@ -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];
}

View File

@@ -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];
}

View File

@@ -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

View File

@@ -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&prime;</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&prime;</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&prime;</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&prime;</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"

View File

@@ -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];
}

View File

@@ -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

View File

@@ -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&prime;</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&prime;</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&prime;</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&prime;</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"

View File

@@ -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];
}

View File

@@ -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')))

View 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&prime;</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&prime;</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&prime;</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&prime;</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&prime;</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&prime;</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"

View 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

View 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&prime;</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&prime;</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&prime;</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&prime;</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"

View File

@@ -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];
}

View File

@@ -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];
}

View File

@@ -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];
}

View File

@@ -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];
}

View File

@@ -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];
}

View File

@@ -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

View 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&prime;</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&prime;</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&prime;</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&prime;</i></span>:~<span class="name"><a href="#Name_returning">returning</a></span>)-> <span id="Variable621_X'"><i class="var">X&prime;</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&prime;</i></a>)-> <span class="name"><a href="#Name_handle-return">handle-return</a></span>(<a href="#Variable621_X'"><i class="var">X&prime;</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"

View File

@@ -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];
}

View File

@@ -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.
*/

View 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&prime;</i></span>, <span id="PartVariable_T''"><i class="var">T&prime;&prime;</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&prime;</i></span>=><span id="Variable312_T"><i class="var">T</i></span>, _:<span id="Variable325_T''"><i class="var">T&prime;&prime;</i></span>=><span id="Variable331_T"><i class="var">T</i></span>) : <span id="Variable347_T'"><i class="var">T&prime;</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&prime;</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&prime;</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&prime;&prime;</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&prime;</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&prime;&prime;</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&prime;</i></span>:~<span class="name"><a href="#Name_throwing">throwing</a></span>)-> <span id="Variable839_X'"><i class="var">X&prime;</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&prime;</i></a>)-> <span class="name"><a href="#Name_handle-thrown">handle-thrown</a></span>(<a href="#Variable839_X'"><i class="var">X&prime;</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"

View File

@@ -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];
}

View File

@@ -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"];
}

View File

@@ -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];
}