From 4bdd9711ef5eb6e07ef23192184d0b35e03e22dd Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Doderlein Date: Wed, 7 Jan 2026 14:46:33 +0100 Subject: [PATCH 1/2] Allow using negative index in imbricated list assignment --- src/org/rascalmpl/semantics/dynamic/Assignable.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/semantics/dynamic/Assignable.java b/src/org/rascalmpl/semantics/dynamic/Assignable.java index 0c561225e83..09da1039fcf 100644 --- a/src/org/rascalmpl/semantics/dynamic/Assignable.java +++ b/src/org/rascalmpl/semantics/dynamic/Assignable.java @@ -607,8 +607,11 @@ public Result interpret(IEvaluator> __eval) { if (receiver.getStaticType().isList()) { if (subscript.getStaticType().isInteger()) { IList list = (IList) receiver.getValue(); - IValue result = list.get(((IInteger) subscript.getValue()) - .intValue()); + int index = ((IInteger) subscript.getValue()).intValue(); + if (index < 0) { + index += list.length(); + } + IValue result = list.get(index); Type type = receiver.getStaticType().getElementType(); return normalizedResult(__eval, type, result); } From 68a7594d07bd01ac1991e8b20c3218b02618c3fa Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Doderlein Date: Wed, 7 Jan 2026 22:43:41 +0100 Subject: [PATCH 2/2] Add regression tests --- .../rascalmpl/library/lang/rascal/tests/basic/Lists.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/org/rascalmpl/library/lang/rascal/tests/basic/Lists.rsc b/src/org/rascalmpl/library/lang/rascal/tests/basic/Lists.rsc index 9d43b55d8ec..aff8f7b056a 100644 --- a/src/org/rascalmpl/library/lang/rascal/tests/basic/Lists.rsc +++ b/src/org/rascalmpl/library/lang/rascal/tests/basic/Lists.rsc @@ -289,6 +289,13 @@ test bool AssignFromEnd1(){ L = [0,1,2,3,4,5,6,7,8,9]; L[-1] = 90; return L == test bool AssignFromEnd2(){ L = [0,1,2,3,4,5,6,7,8,9]; L[-2] = 80; return L == [0,1,2,3,4,5,6,7,80,9]; } test bool AssignFromEnd3(){ L = [0,1,2,3,4,5,6,7,8,9]; L[-10] = 10; return L == [10,1,2,3,4,5,6,7,8,9]; } +// Nested Lists + +test bool AssignNestedList1(){ L = [[0,1,2],[3,4,5],[6,7,8,9]]; L[1][2] = 50; return L == [[0,1,2],[3,4,50],[6,7,8,9]]; } +test bool AccessNestedList1(){ L = [[0,1,2],[3,4,5],[6,7,8,9]]; return L[1][2] == 5; } +test bool AssignNestedList2(){ L = [[0,1,2],[3,4,5],[6,7,8,9]]; L[-2][-1] = 50; return L == [[0,1,2],[3,4,50],[6,7,8,9]]; } +test bool AccessNestedList2(){ L = [[0,1,2],[3,4,5],[6,7,8,9]]; return L[-2][-1] == 5; } + // Library functions test bool tstDelete(list[&T] L) {