@@ -78,6 +78,24 @@ func RangeNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) {
78
78
}, nil
79
79
}
80
80
81
+ func (r * Range ) M__getitem__ (key Object ) (Object , error ) {
82
+ index , err := Index (key )
83
+ if err != nil {
84
+ return nil , err
85
+ }
86
+ // TODO(corona10): Support slice case
87
+ length := computeRangeLength (r .Start , r .Stop , r .Step )
88
+ if index < 0 {
89
+ index += length
90
+ }
91
+
92
+ if index < 0 || index >= length {
93
+ return nil , ExceptionNewf (TypeError , "range object index out of range" )
94
+ }
95
+ result := computeItem (r , index )
96
+ return result , nil
97
+ }
98
+
81
99
// Make a range iterator from a range
82
100
func (r * Range ) M__iter__ () (Object , error ) {
83
101
return & RangeIterator {
@@ -109,6 +127,12 @@ func (it *RangeIterator) M__next__() (Object, error) {
109
127
return r , nil
110
128
}
111
129
130
+ func computeItem (r * Range , item Int ) Int {
131
+ incr := item * r .Step
132
+ res := r .Start + incr
133
+ return res
134
+ }
135
+
112
136
func computeRangeLength (start , stop , step Int ) Int {
113
137
var lo , hi Int
114
138
if step > 0 {
@@ -129,5 +153,6 @@ func computeRangeLength(start, stop, step Int) Int {
129
153
}
130
154
131
155
// Check interface is satisfied
156
+ var _ I__getitem__ = (* Range )(nil )
132
157
var _ I__iter__ = (* Range )(nil )
133
158
var _ I_iterator = (* RangeIterator )(nil )
0 commit comments