public Node apply(Closure closure, Node actualParam){
		ReferenceFrame ref = new ReferenceFrame(closure.getRef());
		Node formalParam = closure.getArgs();
		if (formalParam != null && actualParam != null) {
			Node arg = actualParam, param = formalParam;
			while (arg != null && param != null) {
				if (((Cons)param).isVararg()) {
					ref.addReference((Ident)param.getCar(), arg);
					arg = param = null;
				} else {
					ref.addReference((Ident)param.getCar(), arg.getCar());
					arg = arg.getCdr();
					param = param.getCdr();
				}
			}
			
			if (arg !=null || param != null)
				System.err.println("Invalid param quantity to function");
		}
		if (closure instanceof BuiltIn)
			return ((BuiltIn) closure).execute(actualParam, ref);
		return eval((Node)closure.getCode().getCar(), ref);
	}