![]() |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Navigation |
Synopsis Retrieve a slice of a list.
Syntax
Exp2 and Exp4 are optional.
Types
Description List slicing uses the integer values of
Exp2 and Exp4 to determine the begin (inclusive) and end (exclusive)
of a slice from the list value L of Exp1 . Negative indices count from the end of the list backwards.
Using the second form, an extra index Exp3 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 length of L and let N2 , N3 and N4 be the respective values of the expressions
Exp2 , Exp2 and Exp2 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 elements L[begin] , L[begin+step] , L[end - step] .
When begin >= end , the elements are listed in reverse order.
Examples Consider the list
L = [0, 10, 20, 30, 40, 50, 60, 70, 80]; as running example.
Here is a view on L that will help to correlate positive and negative indices:
Some common use cases (with begin <= end ):
rascal>L = [0, 10, 20, 30, 40, 50, 60, 70, 80];
list[int]: [0,10,20,30,40,50,60,70,80]
Slices with begin < end
rascal>L[1..3]; list[int]: [10,20] rascal>L[1..]; // empty end => end of list list[int]: [10,20,30,40,50,60,70,80] rascal>L[..3]; // empty begin => first element of list list[int]: [0,10,20] rascal>L[..]; // both empty => whole list list[int]: [0,10,20,30,40,50,60,70,80]Slices with begin >= end rascal>L[3..1]; // slice contains elements with indices 3 and 2 (in that order) list[int]: [30,20] rascal>L[3..3]; // empty slice when begin == end list[int]: []Slices with negative begin or end: rascal>L[2..-2]; // equivalent to L[2..7] list[int]: [20,30,40,50,60] rascal>L[2..7]; list[int]: [20,30,40,50,60] rascal>L[-4..-2]; // equivalent to L[5..7] list[int]: [50,60] rascal>L[5..7]; list[int]: [50,60]Slices with an explicit second index: rascal>L[1,3..6]; list[int]: [10,30,50] rascal>L[5,3..]; list[int]: [50,30,10]Explore error cases: rascal>L[..10]; |stdin:///|(4,2,<1,4>,<1,6>): IndexOutOfBounds(10) at ___SCREEN_INSTANCE___(|stdin:///|(0,8,<1,0>,<1,8>)) rascal>L[1..20]; |stdin:///|(5,2,<1,5>,<1,7>): IndexOutOfBounds(20) at ___SCREEN_INSTANCE___(|stdin:///|(0,9,<1,0>,<1,9>)) ![]() |