Halp! type system (__expand_field_0 error), compile time/runtime questions (AoC-2017 puzzle spoilers inside)

aliak something at something.com
Thu Dec 14 22:56:05 UTC 2017


On Thursday, 14 December 2017 at 16:38:26 UTC, Steven 
Schveighoffer wrote:
> So enumerate returns as its element type a Tuple. Specifically, 
> it's going to be a Tuple!(size_t, int), since you are 
> enumerating an array of ints.
>
> I'm not sure why you are having the error, compiling your code 
> above works perfectly fine for me. It would help to know:
>
> a) which version of the compiler you are using?

Tried with dmd v2.077.1. Also with LDC 1.6 (which uses dmd 
v2.076.1)

> b) if the above actually does compile for you, what is the 
> minimal code that does not?

Yes of course, here's a minimal program that does not compile for 
me:

   import std.stdio, std.algorithm, std.range, std.array;

   int rotate(int[] lengths) {
     foreach(skip, length; lengths.enumerate) {}
     return 0;
   }

   auto knotHash(string input) {
     return [1].rotate();
   }

   auto data = ["string"]
     .map!knotHash
     .array;

   void main() {}


The above code, however, will compile with any of the following 
changes, and I don't understand why for any of them:
1) remove .enumerate
2) move the auto data inside the body of main
3) remove the call to .array

> All that aside, you may not realize, this works as well:
>
> foreach(skip, length; lengths)

Sweet, thanks! Yeah that works too.

Another thing I realized is that if I switch from .enumerate to 
the foreach you suggest (in my non minimized example) the compile 
time increases by A LOT. From about 1 second to 70 seconds.




More information about the Digitalmars-d-learn mailing list