package com.babel17.interpreter.values; import com.babel17.interpreter.runtime.Environment; import com.babel17.interpreter.program.Definition; import com.babel17.interpreter.runtime.*; import com.babel17.interpreter.program.*; public final class LambdaFunction extends Lambda { public LambdaFunction(Environment env, Definition definition) { super(env, definition); } public EvalResult apply(Evaluator e, Continuation c, Value v) { if (v instanceof DynamicException) { return c.apply(v); } Environment env = environment().freeze(); Definition d = definition(); int n = d.numCases(); for (int i = 0; i < n; i++) { CaseExpr caseexpr = d.getCase(i); Pattern p = caseexpr.pattern(); MatchResult m = e.match(env, p, v); int status = m.status(); if (status == MatchResult.STATUS_EXCEPTION) { return c.apply(m.exceptionDuringMatch()); } else if (status == MatchResult.STATUS_SUCCESS) { return e.eval(env, c, caseexpr.body()); } } return c.apply(DynamicException.outOfDomain()); } }