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
3f129a14b8
commit
2d93c8b9a7
@ -1,6 +1,7 @@
|
||||
package com.annimon.ownlang.lib;
|
||||
|
||||
import com.annimon.ownlang.exceptions.TypeException;
|
||||
import com.annimon.ownlang.exceptions.UnknownPropertyException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
@ -87,6 +88,22 @@ public class ArrayValue implements Value, Iterable<Value> {
|
||||
return elements[index];
|
||||
}
|
||||
|
||||
public Value get(Value index) {
|
||||
final String prop = index.asString();
|
||||
switch (prop) {
|
||||
// Properties
|
||||
case "length":
|
||||
return NumberValue.of(size());
|
||||
|
||||
// Functions
|
||||
case "isEmpty":
|
||||
return NumberValue.fromBoolean(size() == 0);
|
||||
|
||||
default:
|
||||
return get(index.asInt());
|
||||
}
|
||||
}
|
||||
|
||||
public void set(int index, Value value) {
|
||||
elements[index] = value;
|
||||
}
|
||||
|
@ -43,8 +43,7 @@ public final class ContainerAccessExpression implements Expression, Accessible {
|
||||
final Value lastIndex = lastIndex();
|
||||
switch (container.type()) {
|
||||
case Types.ARRAY:
|
||||
final int arrayIndex = lastIndex.asInt();
|
||||
return ((ArrayValue) container).get(arrayIndex);
|
||||
return ((ArrayValue) container).get(lastIndex);
|
||||
|
||||
case Types.MAP:
|
||||
return ((MapValue) container).get(lastIndex);
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.annimon.ownlang.parser;
|
||||
|
||||
import com.annimon.ownlang.Console;
|
||||
import com.annimon.ownlang.lib.FunctionValue;
|
||||
import com.annimon.ownlang.lib.Functions;
|
||||
import com.annimon.ownlang.lib.NumberValue;
|
||||
import com.annimon.ownlang.lib.Variables;
|
||||
@ -83,6 +84,15 @@ public class ProgramsTest {
|
||||
assertFalse(args[0].asInt() != 0);
|
||||
return NumberValue.ONE;
|
||||
});
|
||||
Functions.set("assertFail", (args) -> {
|
||||
try {
|
||||
((FunctionValue) args[0]).getValue().execute();
|
||||
fail("Function should fail");
|
||||
} catch (Throwable thr) {
|
||||
|
||||
}
|
||||
return NumberValue.ONE;
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
|
26
src/test/resources/other/arrayFunctions.own
Normal file
26
src/test/resources/other/arrayFunctions.own
Normal file
@ -0,0 +1,26 @@
|
||||
def testSetUnknownKey() = assertFail(def() {
|
||||
arr = [1, 2, 3]
|
||||
arr.one = 1
|
||||
})
|
||||
|
||||
def testSetLengthProperty() = assertFail(def() {
|
||||
arr = [1, 2, 3]
|
||||
arr.length = 10
|
||||
})
|
||||
|
||||
def testGetLength() {
|
||||
arr = [1, 2, 3]
|
||||
assertEquals(3, arr.length)
|
||||
}
|
||||
|
||||
def testGetLengthInnerArray() {
|
||||
arr = [[1, 2, 3], [1, 2, [3, 4, 5, 6]]]
|
||||
assertEquals(2, arr.length)
|
||||
assertEquals(3, arr[0].length)
|
||||
assertEquals(4, arr[1][2].length)
|
||||
}
|
||||
|
||||
def testIsEmpty() {
|
||||
arr = [1, 2, 3]
|
||||
assertFalse(arr.isEmpty)
|
||||
}
|
Loading…
Reference in New Issue
Block a user