various questions

Rory Mcguire rjmcguire at gm_no_ail.com
Tue Aug 3 11:28:31 PDT 2010


Jason Spencer wrote:

> == Quote from Rory Mcguire (rjmcguire at gm_no_ail.com)'s article
>> Jason Spencer wrote:
>> > == Quote from Rory Mcguire (rjmcguire at gm_no_ail.com)'s article
>> >> Jason Spencer wrote:
>> >
>> >> > 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.
> 
>> >> 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.
> 
> This is the part I'm still not getting.  Why shouldn't
> 
>    foreach (t; 0..3)
> 
> work?  Those are integer constants.
> 
> Actually, I think I'm getting it.  str_types.length is actually (or
> close to) an integer literal, but t is not.  t over a range is an int
> variable.  So at best, the compiler will infer the type of t and try
> to get TypeTuple![int] from the mixin, which doesn't help.  But it
> works in Iota because it only needs a value, and the length property
> is not a variable, but a compile-time constant.
> 
> I'm not sure what magic gets worked when t is bound to a TypeTuple
> that has int literals, but I'm guessing t in that case is not an int
> variable, but a compile-time type variable, and it iterates over int
> literals.  Those work with templ.  What I really want to know is "does
> that foreach run at compile-time or run-time?"  I suspect compile-time
> because it iterates over type variables.  But documentation is shakey
> :)
> 
> 
> 
>> I convert str_types.length to its actual value below:
>> foreach (t; 3) {
>> ...
>> }
>> You can't do that (dmd : t.d(6): Error: int is not an aggregate
> type)
> 
> Yeah, I mis-typed orginally.  It was "foreach (t;
> 0..str_types.length)" as a range.

The foreach using Iota is unrolled at compile time, bearofile mentioned this 
somewhere as well.



More information about the Digitalmars-d-learn mailing list