143 lines
5.1 KiB
Plaintext
143 lines
5.1 KiB
Plaintext
//[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")
|
|
];
|
|
}
|