diff --git a/compiler/erg_compiler/context/initialize/mod.rs b/compiler/erg_compiler/context/initialize/mod.rs index 56230ada..ebfd0a88 100644 --- a/compiler/erg_compiler/context/initialize/mod.rs +++ b/compiler/erg_compiler/context/initialize/mod.rs @@ -1441,7 +1441,8 @@ impl Context { /* Range */ let range_t = builtin_poly("Range", vec![TyParam::t(mono_q("T"))]); let mut range = Self::builtin_poly_class("Range", vec![PS::t_nd("T")], 2); - range.register_superclass(Obj, &obj); + // range.register_superclass(Obj, &obj); + range.register_superclass(Type, &type_); range.register_marker_trait(builtin_poly("Output", vec![ty_tp(mono_q("T"))])); let mut range_eq = Self::builtin_methods("Eq", 2); range_eq.register_builtin_impl( diff --git a/compiler/erg_compiler/std/_erg_std_prelude.py b/compiler/erg_compiler/std/_erg_std_prelude.py index f9017553..0d7d8e03 100644 --- a/compiler/erg_compiler/std/_erg_std_prelude.py +++ b/compiler/erg_compiler/std/_erg_std_prelude.py @@ -1,3 +1,5 @@ +from collections.abc import Iterable, Sequence, Iterator, Container + def in_operator(x, y): if type(y) == type: if isinstance(x, y): @@ -13,3 +15,93 @@ def in_operator(x, y): NotImplemented else: return x in y + +class Range: + def __init__(self, start, end): + self.start = start + self.end = end + def __contains__(self, item): + pass + def __getitem__(self, item): + pass + def __len__(self): + pass + def __iter__(self): + return RangeIterator(rng=self) + +Sequence.register(Range) +Container.register(Range) +Iterable.register(Range) + +# represents `start<..end` +class LeftOpenRange(Range): + def __contains__(self, item): + return self.start < item <= self.end + def __getitem__(self, item): + return NotImplemented + def __len__(self): + return NotImplemented + +# represents `start..