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()); }