On Wednesday, 6 September 2017 at 05:23:47 UTC, Ali Çehreli wrote:
On 09/05/2017 07:05 PM, Psychological Cleanup wrote:
> Nesting static foreach and using enum has latent problem.
>
> static foreach()
>   static foreach()
>   {
>      enum A = ;
>   }
>
> compiler complains because A is defined multiple times by the
outer most
> foreach.

That's understandable as there are multiple As dropped into code.

> To fix this
>
> static foreach()
>   static foreach()
>   {
>      {
>         enum A = ;
>      }
>   }
>
> But then compiler complains about unexpected { if in a scope
where
> normal {}'s are not expected.

Can you demonstrate with compilable code? Doing what you describe works for me:

void main() {
    static foreach(i; 0 .. 3)
        static foreach(j; 0 .. 3)
        {
            {
                enum A = i * j;
            }
        }
}

Ali

Yes, but I said you can't do that. Put the static foreaches outside main in to a block where one can't simply do {} and it be valid.

You see, the point is that

static foreach
   static foreach
   {

   }

works at the module level

static foreach
   static foreach
   {
       enum a = ;
   }

fails because of multiple a's


so

static foreach
   static foreach
   {
      {
         enum a = ;
      }
   }

to solve that(which, in your given example, works inside main) but fails at the module scope because the { }'s we used to solve the first problem created a new problem. The two methods are mutually exclusive but both are required.


Sure, I could wrap stuff around a function, but what if I'm using them for code generation inside a class? I have to use the extra { } to prevent the enum error but then I get a new error about the { }.


class X
{
   static foreach
     static foreach
     {
       // fails, multiple a
enum a = ; // part of class generation code like generating functions

     }
}


class X
{
   static foreach
     static foreach
     {
       // fails, { } block inside a class.
       {
enum a = ; // part of class generation code like generating functions
       }

     }
}




it works fine if we use it in a function because we can have { } in functions without problems.

Do you not see the contradictory nature? { } required but { } forbidden.


Reply via email to