Isn't using find with retro awkward?

Jonathan M Davis jmdavisProg at gmx.com
Mon Feb 14 20:03:08 PST 2011


On Monday 14 February 2011 19:35:21 Andrej Mitrovic wrote:
> import std.stdio, std.algorithm, std.range;
> 
> void main()
> {
>     writeln( find([5, 1, 2, 3, 4, 5, 1], 5) );
>     writeln( find(retro([5, 1, 2, 3, 4, 5, 1]), 5) );
> }
> 
> Output:
> [5, 1, 2, 3, 4, 5, 1]
> [5, 4, 3, 2, 1, 5]
> 
> The docs for find are:
> "returns : haystack advanced such that binaryFun!pred(haystack.front,
> needle) is true " "To find the last occurence of needle in haystack, call
> find(retro(haystack), needle). "
> 
> To me, if I was looking for the last element in a range I would expect to
> get a range with the found element followed by an elements after it.
> Obviously retro reverses the range (it just hard-wires front=back,
> back=front for those not in the know), so this code is correct.
> 
> Still, I would expect that finding a last element in this range:
> [5, 1, 2, 3, 4, 5, 1]
> 
> would return the range:
> [5, 1]
> 
> and not:
> [5, 4, 3, 2, 1, 5]
> 
> Isn't that what most people would want when they're looking for the last
> matching element?

retro revereses the whole range. What you want is something like findFromBack. Of 
course, retro isn't going to be what you want (though I guess I can understand 
why you would think that it would work if you didn't think it through).

I don't think that we have any functions like findFromBack though. It's probably 
worth an enhancement request.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list