Errors in TDPL
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Jun 21 15:43:03 PDT 2010
On 06/21/2010 04:06 PM, bearophile wrote:
> Adam Ruppe:
>> foreach(i; retro(iota(0, 10))) { }
>
> Oh, right! Or even just:
>
> foreach (i; retro(iota(10))) {}
>
> But abstraction has a cost, see below. I have written three test programs.
Nice work.
iota() currently uses the formula initial + i * step to compute the ith
element. This is to make sure that iota works properly with floating
point numbers as well as integers.
We should specialize iota for integrals to use increment, which should
count for some efficiency gains (currently the optimizer cannot figure
out the equivalence, so it generates the multiply and add in the loop).
If efficiency is still sub-par, retro could detect that it's working
with iota and generate specialized code. That's not too difficult; for
integers, retro(iota(a, b)) could actually be a rewrite to iota(b - 1,
a, -1). Figuring out all corner cases, steps greater than 1, and what to
do for floating point numbers is doable but not trivial either, and
works against modularity. Anyway, it does look like it's all about an
implementation matter.
Andrei
More information about the Digitalmars-d
mailing list