diff options
-rw-r--r-- | changelog.md | 11 | ||||
-rw-r--r-- | lib/system.nim | 10 |
2 files changed, 20 insertions, 1 deletions
diff --git a/changelog.md b/changelog.md index 7aa52ece2..97ce82cd6 100644 --- a/changelog.md +++ b/changelog.md @@ -62,3 +62,14 @@ This now needs to be written as: .. code-block:: nim t[ti] = (if exp_negative: '-' else: '+'); inc(ti) + +- To make Nim even more robust the system iterators ``..`` and ``countup`` + now only accept a single generic type ``T``. This means the following code + doesn't die with an "out of range" error anymore: + +.. code-block:: nim + + var b = 5.Natural + var a = -5 + for i in a..b: + echo i diff --git a/lib/system.nim b/lib/system.nim index 7c095aa2c..9e6f6c039 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -322,7 +322,7 @@ proc `..`*[T, U](a: T, b: U): HSlice[T, U] {.noSideEffect, inline, magic: "DotDo result.b = b proc `..`*[T](b: T): HSlice[int, T] {.noSideEffect, inline, magic: "DotDot".} = - ## `slice`:idx: operator that constructs an interval ``[default(T), b]`` + ## `slice`:idx: operator that constructs an interval ``[default(int), b]`` result.b = b when not defined(niminheritable): @@ -2014,6 +2014,14 @@ when defined(nimNewRoof): while res <= b: yield res inc(res) + + iterator `..`*(a, b: int64): int64 {.inline.} = + ## A special version of `..`` for ``int64`` only. + var res = a + while res <= b: + yield res + inc(res) + else: iterator countup*[S, T](a: S, b: T, step = 1): T {.inline.} = ## Counts from ordinal value `a` up to `b` (inclusive) with the given |