static A evalInQ(Q q, final F0 f) { if (isInQ(q)) ret callF(f); final new Var> var; q.add(r { try { var.set(:: eitherA(callF(f))); } catch e { var.set(:: eitherB(e)); } }); ret returnOrThrow_either(waitForVarToBeNotNull(var)); }