forked from Mirror/wren
Subscript operator for lists.
This commit is contained in:
@ -91,6 +91,28 @@ DEF_PRIMITIVE(list_count)
|
|||||||
return NUM_VAL(list->count);
|
return NUM_VAL(list->count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEF_PRIMITIVE(list_subscript)
|
||||||
|
{
|
||||||
|
// TODO(bob): Instead of returning null here, all of these failure cases
|
||||||
|
// should signal an error explicitly somehow.
|
||||||
|
if (!IS_NUM(args[1])) return NULL_VAL;
|
||||||
|
|
||||||
|
double indexNum = AS_NUM(args[1]);
|
||||||
|
int index = (int)indexNum;
|
||||||
|
// Make sure the index is an integer.
|
||||||
|
if (indexNum != index) return NULL_VAL;
|
||||||
|
|
||||||
|
ObjList* list = AS_LIST(args[0]);
|
||||||
|
|
||||||
|
// Negative indices count from the end.
|
||||||
|
if (index < 0) index = list->count + index;
|
||||||
|
|
||||||
|
// Check bounds.
|
||||||
|
if (index < 0 || index >= list->count) return NULL_VAL;
|
||||||
|
|
||||||
|
return list->elements[index];
|
||||||
|
}
|
||||||
|
|
||||||
DEF_PRIMITIVE(num_abs)
|
DEF_PRIMITIVE(num_abs)
|
||||||
{
|
{
|
||||||
return NUM_VAL(fabs(AS_NUM(args[0])));
|
return NUM_VAL(fabs(AS_NUM(args[0])));
|
||||||
@ -319,6 +341,7 @@ void loadCore(VM* vm)
|
|||||||
|
|
||||||
vm->listClass = AS_CLASS(findGlobal(vm, "List"));
|
vm->listClass = AS_CLASS(findGlobal(vm, "List"));
|
||||||
PRIMITIVE(vm->listClass, "count", list_count);
|
PRIMITIVE(vm->listClass, "count", list_count);
|
||||||
|
PRIMITIVE(vm->listClass, "[ ]", list_subscript);
|
||||||
|
|
||||||
vm->nullClass = AS_CLASS(findGlobal(vm, "Null"));
|
vm->nullClass = AS_CLASS(findGlobal(vm, "Null"));
|
||||||
|
|
||||||
|
|||||||
25
test/list_subscript.wren
Normal file
25
test/list_subscript.wren
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Returns elements.
|
||||||
|
var list = ["a", "b", "c", "d"]
|
||||||
|
io.write(list[0]) // expect: a
|
||||||
|
io.write(list[1]) // expect: b
|
||||||
|
io.write(list[2]) // expect: c
|
||||||
|
io.write(list[3]) // expect: d
|
||||||
|
|
||||||
|
// Allows indexing backwards from the end.
|
||||||
|
io.write(list[-4]) // expect: a
|
||||||
|
io.write(list[-3]) // expect: b
|
||||||
|
io.write(list[-2]) // expect: c
|
||||||
|
io.write(list[-1]) // expect: d
|
||||||
|
|
||||||
|
// Handle out of bounds.
|
||||||
|
// TODO(bob): Should halt the fiber or raise an error somehow.
|
||||||
|
io.write(list[4]) // expect: null
|
||||||
|
io.write(list[-5]) // expect: null
|
||||||
|
|
||||||
|
// Handle wrong argument type.
|
||||||
|
// TODO(bob): Should halt the fiber or raise an error somehow.
|
||||||
|
io.write(list[true]) // expect: null
|
||||||
|
|
||||||
|
// Handle non-integer index.
|
||||||
|
// TODO(bob): Should halt the fiber or raise an error somehow.
|
||||||
|
io.write(list[1.5]) // expect: null
|
||||||
Reference in New Issue
Block a user