Исправлено некорректное обновление переменных внутри функций

This commit is contained in:
Victor 2016-04-03 16:21:19 +03:00
parent 3c6571c7ae
commit d2a159bb45
4 changed files with 20 additions and 11 deletions

View File

@ -44,12 +44,12 @@ public final class UserDefinedFunction implements Function {
try {
Variables.push();
for (int i = 0; i < size; i++) {
Variables.set(getArgsName(i), values[i]);
Variables.define(getArgsName(i), values[i]);
}
// Optional args if exists
for (int i = size; i < totalArgsCount; i++) {
final Argument arg = arguments.get(i);
Variables.set(arg.getName(), arg.getValueExpr().eval());
Variables.define(arg.getName(), arg.getValueExpr().eval());
}
body.execute();
return NumberValue.ZERO;

View File

@ -41,7 +41,7 @@ public final class DestructuringAssignmentStatement implements Statement {
for (int i = 0; i < size; i++) {
final String variable = variables.get(i);
if (variable != null) {
Variables.set(variable, array.get(i));
Variables.define(variable, array.get(i));
}
}
}
@ -50,7 +50,7 @@ public final class DestructuringAssignmentStatement implements Statement {
for (Map.Entry<Value, Value> entry : map) {
final String variable = variables.get(i);
if (variable != null) {
Variables.set(variable, new ArrayValue(
Variables.define(variable, new ArrayValue(
new Value[] { entry.getKey(), entry.getValue() }
));
}

View File

@ -47,7 +47,7 @@ public final class MatchExpression implements Expression, Statement {
return evalResult(p.result);
}
} else {
Variables.set(pattern.variable, value);
Variables.define(pattern.variable, value);
if (optMatches(p)) {
final Value result = evalResult(p.result);;
Variables.remove(pattern.variable);
@ -84,7 +84,7 @@ public final class MatchExpression implements Expression, Statement {
case 1: // match arr { case [x]: x = arr ... }
final String variable = parts.get(0);
Variables.set(variable, array);
Variables.define(variable, array);
if (optMatches(p)) {
return true;
}
@ -107,7 +107,7 @@ public final class MatchExpression implements Expression, Statement {
private boolean matchListPatternEqualsSize(ListPattern p, List<String> parts, int partsSize, ArrayValue array) {
// Set variables
for (int i = 0; i < partsSize; i++) {
Variables.set(parts.get(i), array.get(i));
Variables.define(parts.get(i), array.get(i));
}
if (optMatches(p)) {
// Clean up will be provided after evaluate result
@ -124,14 +124,14 @@ public final class MatchExpression implements Expression, Statement {
// Set element variables
final int lastPart = partsSize - 1;
for (int i = 0; i < lastPart; i++) {
Variables.set(parts.get(i), array.get(i));
Variables.define(parts.get(i), array.get(i));
}
// Set tail variable
final ArrayValue tail = new ArrayValue(arraySize - partsSize + 1);
for (int i = lastPart; i < arraySize; i++) {
tail.set(i - lastPart, array.get(i));
}
Variables.set(parts.get(lastPart), tail);
Variables.define(parts.get(lastPart), tail);
// Check optional condition
if (optMatches(p)) {
// Clean up will be provided after evaluate result

View File

@ -32,9 +32,9 @@ def testTypes() {
assertSameType(0, 0.0)
}
def testFail() {
/*def testFail() {
assertTrue(false)
}
}*/
def testScope() {
x = 5
@ -47,4 +47,13 @@ def testScope() {
assertEquals(15, x)
}
def testFibonacci() {
def fib(n) {
if n < 2 return n
return fib(n-2) + fib(n-1)
}
assertEquals(3, fib(4))
assertEquals(21, fib(8))
}
println runTests()