init commit again
This commit is contained in:
86
IBAF-cbs/Funcons-beta/Values/Composite/Classes/Classes.cbs
Normal file
86
IBAF-cbs/Funcons-beta/Values/Composite/Classes/Classes.cbs
Normal file
@@ -0,0 +1,86 @@
|
||||
### Classes
|
||||
|
||||
[
|
||||
Datatype classes
|
||||
Funcon class
|
||||
Funcon class-instantiator
|
||||
Funcon class-feature-map
|
||||
Funcon class-superclass-name-sequence
|
||||
Funcon class-name-tree
|
||||
Funcon is-subclass-name
|
||||
Funcon class-name-single-inheritance-feature-map
|
||||
]
|
||||
|
||||
|
||||
Datatype
|
||||
classes ::=
|
||||
class(_:thunks(references(objects)), _:environments, _:identifiers*)
|
||||
/*
|
||||
`class(Thunk, Env, C*)` is a class with:
|
||||
* a thunk `Thunk` for instantiating the class,
|
||||
* an environment `Env` with the features declared by the class, and
|
||||
* a sequence `C*` of names of direct superclasses.
|
||||
`class(Thunk, Env)` is a base class, having no superclasses.
|
||||
`class(Thunk, Env, C)` is a class with a single superclass.
|
||||
|
||||
Class instantiation forces its thunk to compute a reference to an object.
|
||||
|
||||
Features are inherited from superclasses. When features with the same name
|
||||
are declared in simultaneously inherited classes, the order of the superclass
|
||||
identifiers in `C*` may affect resolution of references to features.
|
||||
Overloading of feature names is supported by using type maps as features.
|
||||
|
||||
The class table is represented by binding class names to classes.
|
||||
The class superclass hierarchy is assumed to be acyclic.
|
||||
*/
|
||||
|
||||
Funcon
|
||||
class-instantiator(_:classes) : =>thunks(references(objects))
|
||||
Rule
|
||||
class-instantiator
|
||||
class(Thunk:thunks(_), Envs:environments, C*:identifiers*) ~> Thunk
|
||||
|
||||
Funcon
|
||||
class-feature-map(_:classes) : =>environments
|
||||
Rule
|
||||
class-feature-map
|
||||
class(Thunk:thunks(_), Env:environments, C*:identifiers*) ~> Env
|
||||
|
||||
Funcon
|
||||
class-superclass-name-sequence(_:classes) : =>identifiers*
|
||||
Rule
|
||||
class-superclass-name-sequence
|
||||
class(Thunk:thunks(_), Env:environments, C*:identifiers*) ~> C*
|
||||
|
||||
Funcon
|
||||
class-name-tree(_:identifiers) : =>trees(identifiers)
|
||||
/*
|
||||
`class-name-tree C` forms a tree where the branches are the class name
|
||||
trees for the superclasses of `C`.
|
||||
*/
|
||||
Rule
|
||||
class-name-tree(C : identifiers)
|
||||
~> tree(C,
|
||||
interleave-map(
|
||||
class-name-tree given,
|
||||
class-superclass-name-sequence bound-value C))
|
||||
|
||||
|
||||
Funcon
|
||||
is-subclass-name(C:identifiers, C':identifiers) : =>booleans
|
||||
~> is-in-set(C, { forest-value-sequence class-name-tree C' })
|
||||
/*
|
||||
The result of `is-subclass-name(C, C')` does not depend on the order of
|
||||
the names in `forest-value-sequence class-name-tree C'`.
|
||||
*/
|
||||
|
||||
|
||||
Funcon
|
||||
class-name-single-inheritance-feature-map(C:identifiers) : =>environments
|
||||
~> map-override interleave-map(
|
||||
class-feature-map bound-value given,
|
||||
single-branching-sequence class-name-tree C)
|
||||
/*
|
||||
For multiple inheritance, different resolution orders can be specified
|
||||
by using different linearisations of the class name tree.
|
||||
*/
|
||||
125
IBAF-cbs/Funcons-beta/Values/Composite/Classes/index.md
Normal file
125
IBAF-cbs/Funcons-beta/Values/Composite/Classes/index.md
Normal file
@@ -0,0 +1,125 @@
|
||||
---
|
||||
layout: default
|
||||
title: "Classes"
|
||||
parent: Composite
|
||||
ancestor: Funcons-beta
|
||||
|
||||
---
|
||||
|
||||
[Funcons-beta] : [Classes.cbs]
|
||||
-----------------------------
|
||||
|
||||
### Classes
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code>[
|
||||
<i class="keyword">Datatype</i> <span class="name"><a href="#Name_classes">classes</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_class">class</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_class-instantiator">class-instantiator</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_class-feature-map">class-feature-map</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_class-superclass-name-sequence">class-superclass-name-sequence</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_class-name-tree">class-name-tree</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_is-subclass-name">is-subclass-name</a></span>
|
||||
<i class="keyword">Funcon</i> <span class="name"><a href="#Name_class-name-single-inheritance-feature-map">class-name-single-inheritance-feature-map</a></span>
|
||||
]</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Datatype</i>
|
||||
<span class="name"><span id="Name_classes">classes</span></span> ::=
|
||||
<span id="Name_class">class</span>(_:<span class="name"><a href="../../Abstraction/Thunks/index.html#Name_thunks">thunks</a></span>(<span class="name"><a href="../References/index.html#Name_references">references</a></span>(<span class="name"><a href="../Objects/index.html#Name_objects">objects</a></span>)), _:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_environments">environments</a></span>, _:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span><sup class="sup">*</sup>)</code></pre></div>
|
||||
|
||||
|
||||
<code><span class="name"><a href="#Name_class">class</a></span>(<i class="var">Thunk</i>, <i class="var">Env</i>, <i class="var">C<sup class="sup">*</sup></i>)</code> is a class with:
|
||||
* a thunk <code><i class="var">Thunk</i></code> for instantiating the class,
|
||||
* an environment <code><i class="var">Env</i></code> with the features declared by the class, and
|
||||
* a sequence <code><i class="var">C<sup class="sup">*</sup></i></code> of names of direct superclasses.
|
||||
<code><span class="name"><a href="#Name_class">class</a></span>(<i class="var">Thunk</i>, <i class="var">Env</i>)</code> is a base class, having no superclasses.
|
||||
<code><span class="name"><a href="#Name_class">class</a></span>(<i class="var">Thunk</i>, <i class="var">Env</i>, <i class="var">C</i>)</code> is a class with a single superclass.
|
||||
|
||||
Class instantiation forces its thunk to compute a reference to an object.
|
||||
|
||||
Features are inherited from superclasses. When features with the same name
|
||||
are declared in simultaneously inherited classes, the order of the superclass
|
||||
identifiers in <code><i class="var">C<sup class="sup">*</sup></i></code> may affect resolution of references to features.
|
||||
Overloading of feature names is supported by using type maps as features.
|
||||
|
||||
The class table is represented by binding class names to classes.
|
||||
The class superclass hierarchy is assumed to be acyclic.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_class-instantiator">class-instantiator</span></span>(_:<span class="name"><a href="#Name_classes">classes</a></span>) : =><span class="name"><a href="../../Abstraction/Thunks/index.html#Name_thunks">thunks</a></span>(<span class="name"><a href="../References/index.html#Name_references">references</a></span>(<span class="name"><a href="../Objects/index.html#Name_objects">objects</a></span>))
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_class-instantiator">class-instantiator</a></span>
|
||||
<span class="name"><a href="#Name_class">class</a></span>(<span id="Variable308_Thunk"><i class="var">Thunk</i></span>:<span class="name"><a href="../../Abstraction/Thunks/index.html#Name_thunks">thunks</a></span>(_), <span id="Variable325_Envs"><i class="var">Envs</i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_environments">environments</a></span>, <span id="Variable334_C*"><i class="var">C<sup class="sup">*</sup></i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span><sup class="sup">*</sup>) ~> <a href="#Variable308_Thunk"><i class="var">Thunk</i></a></code></pre></div>
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_class-feature-map">class-feature-map</span></span>(_:<span class="name"><a href="#Name_classes">classes</a></span>) : =><span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_environments">environments</a></span>
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_class-feature-map">class-feature-map</a></span>
|
||||
<span class="name"><a href="#Name_class">class</a></span>(<span id="Variable383_Thunk"><i class="var">Thunk</i></span>:<span class="name"><a href="../../Abstraction/Thunks/index.html#Name_thunks">thunks</a></span>(_), <span id="Variable400_Env"><i class="var">Env</i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_environments">environments</a></span>, <span id="Variable409_C*"><i class="var">C<sup class="sup">*</sup></i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span><sup class="sup">*</sup>) ~> <a href="#Variable400_Env"><i class="var">Env</i></a></code></pre></div>
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_class-superclass-name-sequence">class-superclass-name-sequence</span></span>(_:<span class="name"><a href="#Name_classes">classes</a></span>) : =><span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span><sup class="sup">*</sup>
|
||||
<i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_class-superclass-name-sequence">class-superclass-name-sequence</a></span>
|
||||
<span class="name"><a href="#Name_class">class</a></span>(<span id="Variable460_Thunk"><i class="var">Thunk</i></span>:<span class="name"><a href="../../Abstraction/Thunks/index.html#Name_thunks">thunks</a></span>(_), <span id="Variable477_Env"><i class="var">Env</i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_environments">environments</a></span>, <span id="Variable486_C*"><i class="var">C<sup class="sup">*</sup></i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span><sup class="sup">*</sup>) ~> <a href="#Variable486_C*"><i class="var">C<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_class-name-tree">class-name-tree</span></span>(_:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span>) : =><span class="name"><a href="../Trees/index.html#Name_trees">trees</a></span>(<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span>)</code></pre></div>
|
||||
|
||||
<code><span class="name"><a href="#Name_class-name-tree">class-name-tree</a></span> <i class="var">C</i></code> forms a tree where the branches are the class name
|
||||
trees for the superclasses of <code><i class="var">C</i></code>.
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Rule</i>
|
||||
<span class="name"><a href="#Name_class-name-tree">class-name-tree</a></span>(<span id="Variable576_C"><i class="var">C</i></span> : <span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span>)
|
||||
~> <span class="name"><a href="../Trees/index.html#Name_tree">tree</a></span>(<a href="#Variable576_C"><i class="var">C</i></a>,
|
||||
<span class="name"><a href="../../../Computations/Normal/Giving/index.html#Name_interleave-map">interleave-map</a></span>(
|
||||
<span class="name"><a href="#Name_class-name-tree">class-name-tree</a></span> <span class="name"><a href="../../../Computations/Normal/Giving/index.html#Name_given">given</a></span>,
|
||||
<span class="name"><a href="#Name_class-superclass-name-sequence">class-superclass-name-sequence</a></span> <span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_bound-value">bound-value</a></span> <a href="#Variable576_C"><i class="var">C</i></a>))</code></pre></div>
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_is-subclass-name">is-subclass-name</span></span>(<span id="Variable628_C"><i class="var">C</i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span>, <span id="Variable638_C'"><i class="var">C′</i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span>) : =><span class="name"><a href="../../Primitive/Booleans/index.html#Name_booleans">booleans</a></span>
|
||||
~> <span class="name"><a href="../Sets/index.html#Name_is-in-set">is-in-set</a></span>(<a href="#Variable628_C"><i class="var">C</i></a>, { <span class="name"><a href="../Trees/index.html#Name_forest-value-sequence">forest-value-sequence</a></span> <span class="name"><a href="#Name_class-name-tree">class-name-tree</a></span> <a href="#Variable638_C'"><i class="var">C′</i></a> })</code></pre></div>
|
||||
|
||||
|
||||
The result of <code><span class="name"><a href="#Name_is-subclass-name">is-subclass-name</a></span>(<i class="var">C</i>, <i class="var">C′</i>)</code> does not depend on the order of
|
||||
the names in <code><span class="name"><a href="../Trees/index.html#Name_forest-value-sequence">forest-value-sequence</a></span> <span class="name"><a href="#Name_class-name-tree">class-name-tree</a></span> <i class="var">C′</i></code>.
|
||||
|
||||
|
||||
|
||||
<div class="highlighter-rouge"><pre class="highlight"><code><i class="keyword">Funcon</i>
|
||||
<span class="name"><span id="Name_class-name-single-inheritance-feature-map">class-name-single-inheritance-feature-map</span></span>(<span id="Variable740_C"><i class="var">C</i></span>:<span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_identifiers">identifiers</a></span>) : =><span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_environments">environments</a></span>
|
||||
~> <span class="name"><a href="../Maps/index.html#Name_map-override">map-override</a></span> <span class="name"><a href="../../../Computations/Normal/Giving/index.html#Name_interleave-map">interleave-map</a></span>(
|
||||
<span class="name"><a href="#Name_class-feature-map">class-feature-map</a></span> <span class="name"><a href="../../../Computations/Normal/Binding/index.html#Name_bound-value">bound-value</a></span> <span class="name"><a href="../../../Computations/Normal/Giving/index.html#Name_given">given</a></span>,
|
||||
<span class="name"><a href="../Trees/index.html#Name_single-branching-sequence">single-branching-sequence</a></span> <span class="name"><a href="#Name_class-name-tree">class-name-tree</a></span> <a href="#Variable740_C"><i class="var">C</i></a>)</code></pre></div>
|
||||
|
||||
|
||||
For multiple inheritance, different resolution orders can be specified
|
||||
by using different linearisations of the class name tree.
|
||||
|
||||
|
||||
|
||||
____
|
||||
|
||||
From the [PLanCompS Project] | [CBS-beta issues...] | [Suggest an improvement...]
|
||||
|
||||
[Classes.cbs]: Classes.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%20Values/Composite/Classes/Classes.cbs%0A%0AComment/Query/Issue/Suggestion%3A%0A%0A%0ASignature%3A%0A
|
||||
"GENERATE AN EMAIL TEMPLATE"
|
||||
@@ -0,0 +1,120 @@
|
||||
//[https://en.wikipedia.org/wiki/C3_linearization]:
|
||||
//class O
|
||||
//class A extends O
|
||||
//class B extends O
|
||||
//class C extends O
|
||||
//class D extends O
|
||||
//class E extends O
|
||||
//class K1 extends A, B, C
|
||||
//class K2 extends D, B, E
|
||||
//class K3 extends D, A
|
||||
//class Z extends K1, K2, K3
|
||||
|
||||
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-giving initialise-generating initialise-binding finalise-failing
|
||||
scope(collateral(
|
||||
{"O" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map()),
|
||||
map())}
|
||||
,
|
||||
{"A" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
{"a" |-> 1}, "O")}
|
||||
,
|
||||
{"B" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"B",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"C" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"C",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"D" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"D",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"E" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"E",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"K1" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
{"k1" |-> 1, "a" |-> 2} , "A", "B", "C")}
|
||||
,
|
||||
{"K2" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "B", "E")}
|
||||
,
|
||||
{"K3" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "A")}
|
||||
,
|
||||
{"Z" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")}
|
||||
),
|
||||
sequential(
|
||||
print class-feature-map bound-value "O",
|
||||
print class-feature-map bound-value "A",
|
||||
print class-feature-map bound-value "K1"
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [
|
||||
map()
|
||||
,
|
||||
{"a" |-> 1 }
|
||||
,
|
||||
{"k1" |-> 1, "a" |-> 2}
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
//[https://en.wikipedia.org/wiki/C3_linearization]:
|
||||
//class O
|
||||
//class A extends O
|
||||
//class B extends O
|
||||
//class C extends O
|
||||
//class D extends O
|
||||
//class E extends O
|
||||
//class K1 extends A, B, C
|
||||
//class K2 extends D, B, E
|
||||
//class K3 extends D, A
|
||||
//class Z extends K1, K2, K3
|
||||
|
||||
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-giving initialise-generating initialise-binding finalise-failing
|
||||
scope(collateral(
|
||||
{"O" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map()),
|
||||
map())}
|
||||
,
|
||||
{"A" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"B" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"B",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"C" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"C",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"D" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"D",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"E" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"E",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"K1" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "A", "B", "C")}
|
||||
,
|
||||
{"K2" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "B", "E")}
|
||||
,
|
||||
{"K3" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "A")}
|
||||
,
|
||||
{"Z" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")}
|
||||
),
|
||||
sequential(
|
||||
print class-instantiator bound-value "O",
|
||||
print class-instantiator bound-value "A",
|
||||
print class-instantiator bound-value "K1"
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map())
|
||||
,
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map()))
|
||||
,
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map())))
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
//[https://en.wikipedia.org/wiki/C3_linearization]:
|
||||
//class O
|
||||
//class A extends O
|
||||
//class B extends O
|
||||
//class C extends O
|
||||
//class D extends O
|
||||
//class E extends O
|
||||
//class K1 extends A, B, C
|
||||
//class K2 extends D, B, E
|
||||
//class K3 extends D, A
|
||||
//class Z extends K1, K2, K3
|
||||
|
||||
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-giving initialise-generating initialise-binding finalise-failing
|
||||
scope(collateral(
|
||||
{"O" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map()),
|
||||
map())}
|
||||
,
|
||||
{"A" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
{"a" |-> 1}, "O")}
|
||||
,
|
||||
{"B" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"B",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"C" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"C",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"D" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"D",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"E" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"E",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"K1" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
{"k1" |-> 1, "a" |-> 2} , "A", "B", "C")}
|
||||
,
|
||||
{"K2" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "B", "E")}
|
||||
,
|
||||
{"K3" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "A")}
|
||||
,
|
||||
{"K4" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
{"k4" |-> 1, "a" |-> 2}, "A")}
|
||||
,
|
||||
{"Z" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")}
|
||||
),
|
||||
sequential(
|
||||
print class-name-single-inheritance-feature-map "O",
|
||||
print class-name-single-inheritance-feature-map "A",
|
||||
print class-name-single-inheritance-feature-map "K4"
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [
|
||||
map()
|
||||
,
|
||||
{"a" |-> 1 }
|
||||
,
|
||||
{"k4" |-> 1, "a" |-> 2}
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
//[https://en.wikipedia.org/wiki/C3_linearization]:
|
||||
//class O
|
||||
//class A extends O
|
||||
//class B extends O
|
||||
//class C extends O
|
||||
//class D extends O
|
||||
//class E extends O
|
||||
//class K1 extends A, B, C
|
||||
//class K2 extends D, B, E
|
||||
//class K3 extends D, A
|
||||
//class Z extends K1, K2, K3
|
||||
|
||||
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-giving initialise-generating initialise-binding finalise-failing
|
||||
scope(collateral(
|
||||
{"O" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map()),
|
||||
map())}
|
||||
,
|
||||
{"A" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"B" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"B",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"C" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"C",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"D" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"D",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"E" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"E",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"K1" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "A", "B", "C")}
|
||||
,
|
||||
{"K2" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "B", "E")}
|
||||
,
|
||||
{"K3" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "A")}
|
||||
,
|
||||
{"Z" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")}
|
||||
),
|
||||
sequential(
|
||||
print class-name-tree "O",
|
||||
print class-name-tree "A",
|
||||
print class-name-tree "K1",
|
||||
print class-name-tree "Z"
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [
|
||||
tree("O")
|
||||
,
|
||||
tree("A", tree("O"))
|
||||
,
|
||||
tree("K1", tree("A", tree("O")), tree("B", tree("O")), tree("C", tree("O")))
|
||||
,
|
||||
tree("Z",
|
||||
tree("K1", tree("A", tree("O")), tree("B", tree("O")), tree("C", tree("O")))
|
||||
,
|
||||
tree("K2", tree("D", tree("O")), tree("B", tree("O")), tree("E", tree("O")))
|
||||
,
|
||||
tree("K3", tree("D", tree("O")), tree("A", tree("O")))
|
||||
)
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
//[https://en.wikipedia.org/wiki/C3_linearization]:
|
||||
//class O
|
||||
//class A extends O
|
||||
//class B extends O
|
||||
//class C extends O
|
||||
//class D extends O
|
||||
//class E extends O
|
||||
//class K1 extends A, B, C
|
||||
//class K2 extends D, B, E
|
||||
//class K3 extends D, A
|
||||
//class Z extends K1, K2, K3
|
||||
|
||||
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-giving initialise-generating initialise-binding finalise-failing
|
||||
scope(collateral(
|
||||
{"O" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map()),
|
||||
map())}
|
||||
,
|
||||
{"A" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"B" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"B",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"C" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"C",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"D" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"D",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"E" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"E",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"K1" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "A", "B", "C")}
|
||||
,
|
||||
{"K2" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "B", "E")}
|
||||
,
|
||||
{"K3" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "A")}
|
||||
,
|
||||
{"Z" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")}
|
||||
),
|
||||
sequential(
|
||||
print [class-superclass-name-sequence bound-value "O"],
|
||||
print [class-superclass-name-sequence bound-value "A"],
|
||||
print [class-superclass-name-sequence bound-value "K1"]
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [
|
||||
[]
|
||||
,
|
||||
["O"]
|
||||
,
|
||||
["A", "B", "C"]
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
//[https://en.wikipedia.org/wiki/C3_linearization]:
|
||||
//class O
|
||||
//class A extends O
|
||||
//class B extends O
|
||||
//class C extends O
|
||||
//class D extends O
|
||||
//class E extends O
|
||||
//class K1 extends A, B, C
|
||||
//class K2 extends D, B, E
|
||||
//class K3 extends D, A
|
||||
//class Z extends K1, K2, K3
|
||||
|
||||
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-giving initialise-generating initialise-binding finalise-failing
|
||||
scope(collateral(
|
||||
{"O" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map()),
|
||||
map())}
|
||||
,
|
||||
{"A" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"B" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"B",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"C" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"C",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"D" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"D",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"E" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"E",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"K1" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "A", "B", "C")}
|
||||
,
|
||||
{"K2" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "B", "E")}
|
||||
,
|
||||
{"K3" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "A")}
|
||||
,
|
||||
{"Z" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")}
|
||||
),
|
||||
sequential(
|
||||
print bound-value "O",
|
||||
print bound-value "A",
|
||||
print bound-value "K1",
|
||||
print bound-value "Z"
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [
|
||||
class(thunk abstraction reference object(fresh-atom,"O",map()), map())
|
||||
,
|
||||
class(thunk abstraction reference
|
||||
object(fresh-atom,"A",map(), object(fresh-atom,"O",map())), map(), "O")
|
||||
,
|
||||
class(thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "A", "B", "C")
|
||||
,
|
||||
class(thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
//[https://en.wikipedia.org/wiki/C3_linearization]:
|
||||
//class O
|
||||
//class A extends O
|
||||
//class B extends O
|
||||
//class C extends O
|
||||
//class D extends O
|
||||
//class E extends O
|
||||
//class K1 extends A, B, C
|
||||
//class K2 extends D, B, E
|
||||
//class K3 extends D, A
|
||||
//class Z extends K1, K2, K3
|
||||
|
||||
|
||||
general {
|
||||
funcon-term:
|
||||
initialise-giving initialise-generating initialise-binding finalise-failing
|
||||
scope(collateral(
|
||||
{"O" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"O",map()),
|
||||
map())}
|
||||
,
|
||||
{"A" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"A",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"B" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"B",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"C" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"C",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"D" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"D",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"E" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"E",map(),
|
||||
object(fresh-atom,"O",map())),
|
||||
map(), "O")}
|
||||
,
|
||||
{"K1" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "A", "B", "C")}
|
||||
,
|
||||
{"K2" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "B", "E")}
|
||||
,
|
||||
{"K3" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map()))),
|
||||
map(), "D", "A")}
|
||||
,
|
||||
{"Z" |->
|
||||
class(
|
||||
thunk abstraction reference
|
||||
object(fresh-atom,"Z",map(),
|
||||
object(fresh-atom,"K1",map(),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"C",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K2",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"B",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"E",map(),object(fresh-atom,"O",map()))),
|
||||
object(fresh-atom,"K3",map(),
|
||||
object(fresh-atom,"D",map(),object(fresh-atom,"O",map())),
|
||||
object(fresh-atom,"A",map(),object(fresh-atom,"O",map())))),
|
||||
map(), "K1", "K2", "K3")}
|
||||
),
|
||||
sequential(
|
||||
print {forest-value-sequence class-name-tree "O"},
|
||||
print {forest-value-sequence class-name-tree "A"},
|
||||
print {forest-value-sequence class-name-tree "K1"},
|
||||
print {forest-value-sequence class-name-tree "K2"},
|
||||
print {forest-value-sequence class-name-tree "K3"},
|
||||
print {forest-value-sequence class-name-tree "Z"}
|
||||
)
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
tests {
|
||||
result-term: null-value;
|
||||
standard-out: [
|
||||
{"O"},
|
||||
{"A","O"},
|
||||
{"A","B","C","K1","O"},
|
||||
{"B","D","E","K2","O"},
|
||||
{"A","D","K3","O"},
|
||||
{"A","B","C","D","E","K1","K2","K3","O","Z"}
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user