Uses 911K of libraries. Click here for Pure Java version (2628L/13K).
1 | cprint { |
2 | sclass VStack implements Steppable { |
3 | new L<Computable> stack; |
4 | |
5 | void subCompute(Computable computation) { |
6 | computation.stack = this; |
7 | stack.add(computation); |
8 | } |
9 | |
10 | public bool step() { |
11 | if (empty(stack)) false; |
12 | if (last(stack).returned) |
13 | popLast(stack); |
14 | else |
15 | last(stack).run(); |
16 | true; |
17 | } |
18 | } |
19 | |
20 | asclass Computable implements Runnable { |
21 | VStack stack; |
22 | bool returned; |
23 | Runnable continuation; |
24 | } |
25 | |
26 | sclass f_ackermann extends Computable { |
27 | BigInt a, b; |
28 | BigInt returnValue; |
29 | |
30 | *(BigInt *a, BigInt *b) {} |
31 | |
32 | record noeq JustReturn(f_ackermann subComputation) implements Runnable { |
33 | run { |
34 | returnValue = subComputation.returnValue; |
35 | set returned; |
36 | } |
37 | } |
38 | |
39 | record noeq Step2(f_ackermann subComputation) implements Runnable { |
40 | run { |
41 | f_ackermann subComputation2 = new(minus(a, BigInt.ONE), |
42 | subComputation.returnValue); |
43 | continuation = new JustReturn(subComputation2); |
44 | stack.subCompute(subComputation2); |
45 | } |
46 | } |
47 | |
48 | run { |
49 | if (continuation != null) |
50 | ret with continuation.run(); |
51 | |
52 | if (a.equals(BigInt.ZERO)) { |
53 | returnValue = plus(b, BigInt.ONE); |
54 | ret with set returned; |
55 | } |
56 | |
57 | if (b.equals(BigInt.ZERO)) { |
58 | f_ackermann subComputation = new(a.subtract(BigInt.ONE), BigInt.ONE); |
59 | continuation = new JustReturn(subComputation); |
60 | stack.subCompute(subComputation); |
61 | ret; |
62 | } |
63 | |
64 | f_ackermann subComputation = new(a, minus(b, BigInt.ONE)); |
65 | continuation = new Step2(subComputation); |
66 | stack.subCompute(subComputation); |
67 | } |
68 | } |
69 | |
70 | start-thread { |
71 | new VStack stack; |
72 | f_ackermann ack = new(bigInt(2), bigInt(2)); |
73 | stack.subCompute(ack); |
74 | stepAllWithStats(stack); |
75 | print("Result: " + ack.returnValue); |
76 | } |
77 | } |
Began life as a copy of #1030372
download show line numbers debug dex old transpilations
Travelled to 4 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt
No comments. add comment
Snippet ID: | #1030373 |
Snippet name: | Turn Ackermann function into a virtual stack [OK] |
Eternal ID of this version: | #1030373/7 |
Text MD5: | 227afedfc71512ffd21b5bf32f7161fe |
Transpilation MD5: | c226f63006e47eb32dacb44bd1716c3b |
Author: | stefan |
Category: | javax / maths |
Type: | JavaX source code (Dynamic Module) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2020-12-10 13:58:37 |
Source code size: | 1982 bytes / 77 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 205 / 324 |
Version history: | 6 change(s) |
Referenced in: | [show references] |