| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Navigation |
Synopsis Retrieve a slice of a node's argument list.
Syntax
Exp_{2} and Exp_{4} are optional.
Types
Description A Node slice is similar to a list Slice and uses the integer values of
Exp_{2} and Exp_{4} to determine the begin (inclusive) and end (exclusive)
of a slice from the children of the node value ND of Exp_{1} . Negative indices count from the end of the list of children backwards.
Using the second form, an extra index Exp_{3} is given that determines the
index of the second element in the slice and establishes the step between
successive elements in the slice. The default step is 1.
If end is smaller than begin , the slice is constructed backwards.
Let Len be the number of children of ND and let N_{2} , N_{3} and N_{4} be the respective values of the expressions
Exp_{2} , Exp_{2} and Exp_{2} when they are present.
The slice parameters begin , end , and step are determined as follows:
0 <= begin < Len and 0 < end < Len should hold,
otherwise the exception IndexOutOfBounds is thrown.
The slice consists of the children ND[begin] , ND[begin+step] , ND[end - step] .
When begin >= end , the elements are listed in reverse order.
Examples Consider the list
ND = "f"(0, "abc", 20, false, 40, [3,4,5], 60, {"a", "b"}, 80); as running example.
Here is a view on the children of ND that will help to correlate positive and negative indices:
begin <= end ):
rascal>ND = "f"(0, "abc", 20, false, 40, [3,4,5], 60, {"a", "b"}, 80);
node: "f"(
0,
"abc",
20,
false,
40,
[3,4,5],
60,
{"a","b"},
80)
Slices with begin < end
rascal>ND[1..3]; list[value]: ["abc",20] rascal>ND[1..]; // empty end => end of list of children list[value]: [ "abc", 20, false, 40, [3,4,5], 60, {"a","b"}, 80 ] rascal>ND[..3]; // empty begin => first child of list list[value]: [0,"abc",20] rascal>ND[..]; // both empty => whole list of children list[value]: [ 0, "abc", 20, false, 40, [3,4,5], 60, {"a","b"}, 80 ]Slices with begin >= end rascal>ND[3..1]; // slice contains children with indices 3 and 2 (in that order) list[value]: [false,20] rascal>ND[3..3]; // empty slice when begin == end list[value]: []Slices with negative begin or end: rascal>ND[2..-2]; // equivalent to ND[2..7] list[value]: [ 20, false, 40, [3,4,5], 60 ] rascal>ND[2..7]; list[value]: [ 20, false, 40, [3,4,5], 60 ] rascal>ND[-4..-2]; // equivalent to ND[5..7] list[value]: [ [3,4,5], 60 ] rascal>ND[5..7]; list[value]: [ [3,4,5], 60 ]Slices with an explicit second index: rascal>ND[1,3..6]; list[value]: [ "abc", false, [3,4,5] ] rascal>ND[5,3..]; list[value]: [ [3,4,5], false, "abc" ]Explore error cases: rascal>ND[..10]; |stdin:///|(5,2,<1,5>,<1,7>): IndexOutOfBounds(10) at ___SCREEN_INSTANCE___(|stdin:///|(0,9,<1,0>,<1,9>)) rascal>ND[1..20]; |stdin:///|(6,2,<1,6>,<1,8>): IndexOutOfBounds(20) at ___SCREEN_INSTANCE___(|stdin:///|(0,10,<1,0>,<1,10>)) |