1 | sclass VStack implements Steppable { |
2 | new L<Computable> stack; |
3 | O latestResult; |
4 | |
5 | // was last instruction a return? |
6 | // can be used by computations to switch without a label |
7 | transient bool justReturned; |
8 | transient O subComputationResult; |
9 | |
10 | // the null sentinel replaces a null function result |
11 | // when stored in latestResult |
12 | sclass NullSentinel {} |
13 | static new NullSentinel nullSentinel; |
14 | |
15 | *() {} |
16 | *(Computable computation) { push(computation); } |
17 | *(Iterable<Computable> l) { pushAll(l); } |
18 | |
19 | // A is what the function returns |
20 | interface Computable<A> { |
21 | public void step(VStack stack, O subComputationResult); |
22 | } |
23 | |
24 | private O deSentinel(O o) { |
25 | ret o instanceof NullSentinel ? null : o; |
26 | } |
27 | |
28 | private O sentinel(O o) { |
29 | ret o == null ? nullSentinel : o; |
30 | } |
31 | |
32 | // called by computations or users to start a subroutine |
33 | void push aka call(Computable computation) { |
34 | stack.add(computation); |
35 | } |
36 | |
37 | // perform a computation step. returns false iff done |
38 | public bool step() { |
39 | if (empty(stack)) false; |
40 | justReturned = latestResult != null; |
41 | subComputationResult = deSentinel(latestResult); |
42 | latestResult = null; |
43 | last(stack).step(this, subComputationResult); |
44 | subComputationResult = null; |
45 | true; |
46 | } |
47 | |
48 | // called from a computation to return a value |
49 | void _return(O value default null) { |
50 | latestResult = sentinel(value); |
51 | removeLast(stack); |
52 | } |
53 | |
54 | // called from a computation to tail-call another routine |
55 | void tailCall aka replace(Computable computation) { |
56 | removeLast(stack); |
57 | stack.add(computation); |
58 | } |
59 | |
60 | // all-in-one evaluation function - call on an empty stack |
61 | <A> A compute(Computable<A> computation) { |
62 | if (computation == null) null; |
63 | push(computation); |
64 | stepAll(this); |
65 | ret (A) latestResult; |
66 | } |
67 | |
68 | // return result of just completed computation |
69 | O result aka subResult() { |
70 | ret deSentinel(latestResult); |
71 | } |
72 | |
73 | bool hasSubResult() { ret justReturned; } |
74 | |
75 | void pushAll(Iterable<Computable> l) { |
76 | fOr (Computable c : l) |
77 | push(c); |
78 | } |
79 | } |
Began life as a copy of #1030376
download show line numbers debug dex old transpilations
Travelled to 4 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt
No comments. add comment
Snippet ID: | #1030986 |
Snippet name: | VStack [backup before restructuring] |
Eternal ID of this version: | #1030986/1 |
Text MD5: | c9822bca9533b008cf477ebf9d8f4db2 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2021-04-18 14:55:05 |
Source code size: | 2137 bytes / 79 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 162 / 183 |
Referenced in: | [show references] |