std.range.cacheFront proposal&working code: wraps a range to enforce front is called only once
Jonathan M Davis
jmdavisProg at gmx.com
Thu Oct 24 12:50:34 PDT 2013
On Thursday, October 24, 2013 21:10:58 deadalnix wrote:
> On Thursday, 24 October 2013 at 17:57:54 UTC, Jonathan M Davis
>
> wrote:
> > Now, that being said, I'd argue that map should probably be
> > changed so that it
> > calls its function on popFront rather than front (though that
> > has the downside
> > of requiring that it then hold the current value, which it
> > doesn't currently
> > have to do), but regardless, you're using map for something
> > other than what it
> > was designed to do.
>
> That would break random access.
No, it wouldn't. It would just require that the function be called directly in
the case of random access, so you then have the problem with randomly accessed
values that you really can't implement map in a way that avoids a calling its
function every time you randomly access a variable. It's one more reason to
consider not accessing the same element in a range multiple times, but as it's
pretty much a guarantee that at least some range-based code will access front
multiple times, it's not a good idea for the range to be designed such that it
can't reasonably handle having each element accessed multiple times - which in
the case of map would imply that the programmer using map should make sure
that the function they give it can handle being called multiple times per
element without changing the semantics of the code. It also would imply that
doing something like
range.map!(a => new Aboject(a))
like you do in another post should be done with great care if at all, as there
is a high risk that you will end up creating multiple objects per element as
you traverse the range unless you specifically make sure that use foreach on it
or immediately convert it to an array.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list