Jason Spencer wrote: > Ok, I've gone over this, adapted it, and mostly understand it. I just > have one question left: > > == Quote from bearophile (bearophileh...@lycos.com)'s article >> template Iota(int stop) { >> ... >> alias TypeTuple!(Iota!(stop-1), stop-1) Iota; >> } >> ... >> foreach (t; Iota!(str_types.length)) > > What happens at compile-time with this foreach loop? > > I nievely went and replaced "foreach (t; Iota!(str_types.length))" > with "foreach (t; str_types.length)", since the length of that array > is known at compile-time. That of course bombed, but I don't quite > get why. Is the compiler actually evaluating the foreach loop at > compile time? How could it, when the body makes run-time checks? If > it's not, why doesn't my change work? > > Jason
your replacement tries to loop over an uint called str_types.length. Never gonna happen. Iota!(str_types.length) seems to generate str_types.length(a number of) integer indexes. Can't use 0 .. str_types.length in the foreach because compiler is expecting Integer constants so it can make the template "foo" into actual code.