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