Получение функций из переменных

This commit is contained in:
Victor 2015-07-17 14:48:00 +03:00
parent cf51c55c65
commit cd7382bcbc

View File

@ -1,7 +1,9 @@
package com.annimon.ownlang.parser.ast; package com.annimon.ownlang.parser.ast;
import com.annimon.ownlang.lib.Function; import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.FunctionValue;
import com.annimon.ownlang.lib.Functions; import com.annimon.ownlang.lib.Functions;
import static com.annimon.ownlang.lib.Functions.isExists;
import com.annimon.ownlang.lib.UserDefinedFunction; import com.annimon.ownlang.lib.UserDefinedFunction;
import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.lib.Value;
import com.annimon.ownlang.lib.Variables; import com.annimon.ownlang.lib.Variables;
@ -39,7 +41,7 @@ public final class FunctionalExpression implements Expression {
values[i] = arguments.get(i).eval(); values[i] = arguments.get(i).eval();
} }
final Function function = Functions.get(name); final Function function = getFunction(name);
if (function instanceof UserDefinedFunction) { if (function instanceof UserDefinedFunction) {
final UserDefinedFunction userFunction = (UserDefinedFunction) function; final UserDefinedFunction userFunction = (UserDefinedFunction) function;
if (size != userFunction.getArgsCount()) throw new RuntimeException("Args count mismatch"); if (size != userFunction.getArgsCount()) throw new RuntimeException("Args count mismatch");
@ -55,6 +57,15 @@ public final class FunctionalExpression implements Expression {
return function.execute(values); return function.execute(values);
} }
private Function getFunction(String key) {
if (Functions.isExists(key)) return Functions.get(key);
if (Variables.isExists(key)) {
final Value value = Variables.get(key);
if (value instanceof FunctionValue) return ((FunctionValue)value).getValue();
}
throw new RuntimeException("Unknown function " + key);
}
@Override @Override
public void accept(Visitor visitor) { public void accept(Visitor visitor) {
visitor.visit(this); visitor.visit(this);