@Override public LispObject evalImpl(final Environment env, final LispThread thread) { if (false && car.isOperator()) { LispObject fun = car; // env.lookupFunction(car); if (fun != null) return evalCall(fun, cdr, env, thread); } if (car.isSymbol()) { final Symbol first = (Symbol) car; LispObject fun = env.lookupFunction(car); if (fun instanceof SpecialOperator) { if (profiling) if (!sampling) fun.incrementCallCount(); // Don't eval args! maybeSaveSymbolFunction(first, fun); return fun.execute(cdr, env); } if (fun != null && fun.isMacroObject()) { maybeSaveSymbolFunction(first, fun); LispObject lo = macroexpand(this, env, thread); return eval(lo, env, thread); } if (fun != null && fun.isAutoload()) { Autoload autoload = (Autoload) fun; autoload.load(); maybeSaveSymbolFunction(first, autoload); return eval(this, env, thread); } maybeSaveSymbolFunction(first, fun); return evalCall(fun != null ? fun : first, cdr, env, thread); } else { final LispObject first = car; if (first != null && first.isCons() && first.car() == Symbol.LAMBDA) { Closure closure = new Closure(first, env); maybeSaveSymbolFunction(first, closure); return evalCall(closure, cdr, env, thread); } else return program_error("Illegal function object: " + Lisp.princNonNull(first) + "."); } }