Iota
H. S. Teoh
hsteoh at qfbox.info
Sat Aug 6 15:52:13 UTC 2022
On Sat, Aug 06, 2022 at 03:11:28PM +0000, Paul Backus via Digitalmars-d wrote:
> On Friday, 5 August 2022 at 15:31:18 UTC, Steven Schveighoffer wrote:
> > As for working with arbitrary types, I don't see a problem with it.
> > If you define ++ on your type or += 1, and it doesn't mean the same
> > as every other type that defines that, then it's on you for not
> > following the conventions. D is a language which uses the
> > introspected abilities of things to define whether they are
> > compatible.
>
> One of the problems with `iota` is that, because it was built up by
> accretion of special cases, it does *not* adhere to any kind of
> consistent structural interface.
>
> For example, this works:
>
> iota(BigInt(1), BigInt(10))
>
> ...but this does not:
>
> iota(BigInt(1), BigInt(10), BigInt(1))
>
> ...because nobody ever bothered to add a `(start, end, step)` overload
> for custom types.
Perhaps what we need is to sit down and come up with a consistent model
for iota and implement that. A consistent API of what is expected of
incoming types and how iota will behave in each case.
Here's a first stab at it. Let T be the incoming type (I'm leaning
against separately parametrizing the start/end/increment types, I think
that's just needlessly complex). Then:
0. T must at least support < and at least one of ++, +. If not, iota(T)
is not supported.
1. If T supports ++, then iota(start,end) will return at least an input
range.
2. If `T + int` is valid, then iota(start,end) will return at least a
random-access range.
3. If `T + T` is valid, then iota(start,end,step) will return at least
an input range.
4. If `T + int*T` is valid, then iota(start,end,step) will return a
random-access range.
T
--
Leather is waterproof. Ever see a cow with an umbrella?
More information about the Digitalmars-d
mailing list