public Result<IValue> interpret(IEvaluator<Result<IValue>> __eval) {
__eval.setCurrentAST(this);
__eval.notifyAboutSuspension(this);
AbstractFunction lambda;
boolean varArgs = this.getSignature().getParameters().isVarArgs();
if (hasJavaModifier(this)) {
throw new NonAbstractJavaFunction(this);
}
ISourceLocation src = this.getLocation();
AbstractAST ret = ASTBuilder.makeStat("Return", src, ASTBuilder.makeStat("Expression", src, getExpression()));
AbstractAST fail = ASTBuilder.makeStat("Fail", src, ASTBuilder.make("Target", "Labeled", src, getSignature().getName()));
AbstractAST ite = ASTBuilder.makeStat("IfThenElse", src, ASTBuilder.make("Label", "Empty", src), getConditions(), ret, fail);
List<AbstractAST> sl = Arrays.<AbstractAST>asList(ite);
AbstractAST body = ASTBuilder.make("FunctionBody", "Default", src, sl);
FunctionDeclaration.Default func = ASTBuilder.make("FunctionDeclaration", "Default", src, getTags(), getVisibility(), getSignature(), body);
lambda = new RascalFunction(__eval, func, varArgs, __eval
.getCurrentEnvt(), __eval.__getAccumulators());
__eval.getCurrentEnvt().storeFunction(lambda.getName(), lambda);
__eval.getCurrentEnvt().markNameFinal(lambda.getName());
__eval.getCurrentEnvt().markNameOverloadable(lambda.getName());
lambda.setPublic(this.getVisibility().isPublic() || this.getVisibility().isDefault());
return lambda;
}