protected Element call(List<Element> params) {
		//if the arity and param list correspond in size
		if((null == params && arity == 0) || (null != params && params.size() == arity) || arity == -1) {
			if(null == params) {
				return apply(new ArrayList<Element>());
			} else if(!special) {
				List<Element> evaluatedParams = new ArrayList<Element>();
				for(Element param : params) {
					evaluatedParams.add(Interpreter.execute(param));
				}
				return apply(evaluatedParams);
			} else return apply(params);
		} else {
			//System.out.println(params);
			System.out.println(name + " given " + (null == params ? 0 : params.size()) + " args, but needs " + arity + " args");
			return ListElement.nil;
		}
	}