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

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 { try {
Variables.push(); Variables.push();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
Variables.set(getArgsName(i), values[i]); Variables.define(getArgsName(i), values[i]);
} }
// Optional args if exists // Optional args if exists
for (int i = size; i < totalArgsCount; i++) { for (int i = size; i < totalArgsCount; i++) {
final Argument arg = arguments.get(i); final Argument arg = arguments.get(i);
Variables.set(arg.getName(), arg.getValueExpr().eval()); Variables.define(arg.getName(), arg.getValueExpr().eval());
} }
body.execute(); body.execute();
return NumberValue.ZERO; return NumberValue.ZERO;

View File

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

View File

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

View File

@ -32,9 +32,9 @@ def testTypes() {
assertSameType(0, 0.0) assertSameType(0, 0.0)
} }
def testFail() { /*def testFail() {
assertTrue(false) assertTrue(false)
} }*/
def testScope() { def testScope() {
x = 5 x = 5
@ -47,4 +47,13 @@ def testScope() {
assertEquals(15, x) 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() println runTests()