package com.babel17.interpreter.runtime; import com.babel17.interpreter.values.Value; public abstract class EvalResult { public abstract Object finalResult(); public abstract EvalResult evaluate(); public Object trampoline() { Object v = null; EvalResult e = this; do { v = e.finalResult(); e = e.evaluate(); } while (v == null); return v; } private static final class FinalResult extends EvalResult { FinalResult(Object value) { this.value = value; } public Object finalResult() { return value; } public EvalResult evaluate() { return this; } private Object value; } public abstract static class Lambda extends EvalResult { protected Lambda() { } public Object finalResult() { return null; } } public static EvalResult createFinalResult(Object v) { return new FinalResult(v); } }