Expr Visit(string name, FunctionBody function)
{
var parentScope = scope;
scope = Scope.CreateFunctionChild(scope);
var parameters = function.Parameters.Select(p => scope.AddLocal(p)).ToList();
if (function.Varargs)
{
parameters.Add(scope.AddLocal(Constant.VARARGS, typeof(Varargs)));
}
var bodyExpr = Expr.Block(Visit(function.Body), Expr.Label(scope.GetReturnLabel(), Expr.Constant(null)));
var lambdaExpr = Expr.Lambda(bodyExpr, Constant.FUNCTION_PREFIX + name, parameters);
scope = parentScope;
return(lambdaExpr);
}