!7 sclass Calculation { O f; Calculation deferredTo; OKOrError result; *() {} *(O *f) {} void calc() { if (done()) ret; try { result = OKOrError_ok(callF(f)); } catch e { Throwable inner = getInnerException(e); if (inner instanceof DeferCalculation) deferredTo = inner/DeferCalculation.calculation(); else result = OKOrError_error(e); } } bool done() { ret result != null || deferredTo != null; } toString { S s = "Calculation of " + f + "."; if (deferredTo != null) s += " Deferred to: " + deferredTo; else if (result != null) s += " " + result; else s += " Not run"; ret s; } Calculation resolve() { Calculation c = this; while (c.deferredTo != null) c = c.deferredTo; ret c; } } p { Calculation c = new Calculation(f now); print(c); c.calc(); print(c); c = new Calculation(f fail); c.calc(); print(c); c = new Calculation(r { throw DeferCalculation(Calculation(f now)) }); print(c); c.calc(); print(c); c = c.resolve(); c.calc(); print(c); }