mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Исправлено некорректное обновление переменных внутри функций
This commit is contained in:
parent
3c6571c7ae
commit
d2a159bb45
@ -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;
|
||||
|
@ -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() }
|
||||
));
|
||||
}
|
||||
|
@ -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
|
||||
|
13
tests.own
13
tests.own
@ -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()
|
Loading…
Reference in New Issue
Block a user