cprint { srecord f_ackermann(BigInt a, BigInt b) implements VStack.Computable { void step(VStack stack, O subComputationResult) { if (!stack.hasSubResult()) { if (a.equals(BigInt.ZERO)) stack._return(plus(b, BigInt.ONE)); else if (b.equals(BigInt.ZERO)) stack.tailCall(new f_ackermann(a.subtract(BigInt.ONE), BigInt.ONE); else stack.push(new f_ackermann(a, minus(b, BigInt.ONE))); } else stack.tailCall(new f_ackermann(minus(a, BigInt.ONE), subComputationResult/BigInt)); } } start-thread { print("Result: " + vStackComputeWithStats(new f_ackermann(bigInt(2), bigInt(2)))); // detailed run VStack stack = new(new f_ackermann(bigInt(2), bigInt(2))); printStruct(stack); while ping (stack.step()) { printStruct(stack); stack = restructure(stack); // persist to string and re-create } } }