I'm back
Jonathan M Davis
jmdavisProg at gmx.com
Thu Nov 15 04:38:04 PST 2012
On Thursday, November 15, 2012 13:17:12 jerro wrote:
> > std.array.array will never work with ranges with a transient
> > front unless it
> > somehow knew when it was and wasn't appropriate to dup, which
> > it's not going
> > to know purely by looking at the type of front. The creator of
> > the range would
> > have to tell them somehow. And even then, it wouldn't work
> > beyond the built-in
> > types, because there's no generic way to dup stuff.
>
> Daniel was actually talking about std.byLine.map!"a.dup", which
> is not a transient range, but would be considered transient if we
> did what Andrei suggests.
Well, there's no way around that as far as I can see. Even if all ranges had
to be explicitly marked as transient or not, map would be in a bind here,
because it knows nothing about what the function it was given is doing, so it
has no way of knowing how it affects transience. At minimum, it would be forced
to mark itself as transient if the original range was (even if the function
used idup), or it would _always_ be forced to mark it as transient (I'm not
sure which). The only way out would be if there were a way to tell map
explicitly to mark the resultant range as having a non-transient front.
By using type deduction like Andrei is suggesting, then we can at least deduce
that map!"a.idup" has a non-transient front, but the only way that we'd know
that map!"a.dup" was non-transient was if map were told somehow, and it defined
an enum that the hasTransientFront trait could examine (i.e. we're back in the
boat we'd be in if all ranges had to declare whether they were transient or
not). So, as long as we can have transient fronts, map!"a.dup" is screwed,
which may or may not be a problem. It's arguably a lot like how we keep having
to explain why functions don't work with narrow strings because of how narrow
strings aren't random-access, don't have length, etc. And that's definitely
annoying, but we can't really fix it.
It's looking like this comes down to either banning ranges with transient
fronts entirely (and changing how ByLine and ByChunk work), or we're going to
have to deal with quirks like array(map!"a.dup"(file.byLine())) not working
whereas array(map!"a.idup"(file.byLine())) does work.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list