On Saturday, 28 July 2012 at 14:36:26 UTC, Ali Çehreli wrote:
On 07/28/2012 06:49 AM, Philip Daniels wrote:

> It seems to
> be something to do with whether the array is static or
dynamic.

Good catch! :) Welcome to D where static arrays (aka "fixed-length arrays") and dynamic arrays (aka "slices") are different beasts.

A number of factors are at play here:

1) Static arrays are value types. As a result, the entire array gets copied when pass to a function (e.g. reduce) as an argument.

2) The length of static arrays cannot change.

3) Phobos is a range-based library. reduce() is an algorithm that not more than an InputRange.[*] InputRanges are naturally consumed as they are being iterated over.

For the reasons above, a static array is not usable by reduce(). Your solution of taking a slice of all of the elements first by _word_tables[] is the correct solution (and very cheap, thanks to D's slices).

Ali

[*] Arguably, reduce() could have a specialization that worked on RandomAccessRanges (static arrays included), making life easier. I don't see why that could not be added to Phobos.

Thanks for the explanation Ali. I was planning on converting the array to dynamic anyway, since the ultimate size is dependent upon the program's input, so I think I'll do that now.

Reply via email to