@Override
	public Object visitFunction(FuncCallAST funcCall) {
		EvaluationFunction function = functions.get(funcCall.getFuncName().toLowerCase());
		if (function == null) {
			throw new EvalutionVisitorException("Can't find function with name " + funcCall.getFuncName());
		}
		function.setVariablesLoader(variablesLoader);
		if (!function.lazyArguments()) {
			List<Object> paramsValues = new ArrayList<Object>();
			for (FuncParamAST paramAST : funcCall.getParams()) {
				paramsValues.add(paramAST.visit(this));
			}
			return EvalutionHelpers.callFunction(funcCall.getFuncName(), function, paramsValues);
		} else {
			List<LazyValue<?>> values = new ArrayList<LazyValue<?>>();
			for(final FuncParamAST paramAST : funcCall.getParams()){
				values.add(LazyValue.create(new F0<Object>() {
					@Override
					public Object f() {
						return paramAST.visit(StandardEvaluationVisitor.this);
					}
				}));
			}
			function.setLazyValues(values);
			return function.handle(Arrays.asList());
		}
	}