public SubLObject eval(final SubLEnvironment env) {
   Values.resetMultipleValues();
   SubLObject operatorSymbol = first();
   if (operatorSymbol.isSymbol()) {
     SubLOperator operator = operatorSymbol.toSymbol().getFunction();
     if (operator.isFunction()) {
       return operator.getFunc().evalViaApply(this.toCons(), env);
     }
     if (operator.isSpecial()) {
       final SubLFunction func = operator.toSpecialOperator().getEvaluationFunction();
       final BinaryFunction binFunc = func.getBinaryFunction();
       if (binFunc != null) {
         return binFunc.processItem(toCons(), env);
       }
       return func.apply(this.toCons(), env);
     }
     if (operator.isMacroOperator()) {
       return operator
           .toMacro()
           .getMacroExpander()
           .apply(this.asConsList().toCons(), env)
           .eval(env); // @hack asConsList() call
     }
     Errors.error(operatorSymbol + " does not have a function value.");
   } else if (SubLInterpretedFunction.isPossiblyLambdaExpression(operatorSymbol, true)) {
     final SubLInterpretedFunction lambda =
         SubLOperatorFactory.makeInterpretedFunction(operatorSymbol.toCons(), env);
     return lambda.evalViaApply(this.toCons(), env);
   }
   throw new InvalidSubLExpressionException(operatorSymbol + " is not an operator.");
 }
 public final SubLOperator getFunction() {
   if (!isCons()) {
     Errors.error(this + " is not of type: STREAM.");
     return null;
   }
   return SubLOperatorFactory.makeInterpretedFunction(
       this.toCons(), SubLEnvironment.currentEnvironment());
 }