Static foreach bug?

bauss jj_1337 at live.dk
Sun Sep 2 19:42:20 UTC 2018


On Sunday, 2 September 2018 at 18:07:10 UTC, Jonathan M Davis 
wrote:
> On Sunday, September 2, 2018 7:21:05 AM MDT bauss via 
> Digitalmars-d wrote:
>> Is there a reason why you cannot create a separate scope 
>> within a static foreach?
>>
>> The below will not compile:
>>
>> ```
>> enum a = ["a" : "a", "b" : "b", "c" : "c"];
>>
>> static foreach (k,v; a)
>> {
>>      {
>>          enum b = k;
>>          enum c = v;
>>      }
>> }
>> ```
>>
>> It works if it's in a function of course.
>>
>> This creates a big limitation when you're trying to ex. loop 
>> through members of inherited classes, interfaces etc. and then 
>> want to store the information in variables, because you cannot 
>> do it. Which means to work around it you have to do it all in 
>> an ugly one-liner.
>>
>> Is it intended behavior? If so, why? If not is there a 
>> workaround until it can be fixed?
>
> If you're not inside a function, why would it even be useful to 
> be able to do that? That would be the equivalent of
>
> {
>     enum b = "a";
>     enum c = "a";
> }
> {
>     enum b = "b";
>     enum c = "b";
> }
> {
>     enum b = "c";
>     enum c = "c";
> }
>
> Creating scopes like that isn't legal outside of a function 
> (hence the compiler error), but even if it were, what good 
> would it do you? There's no way to refer to those scopes. The 
> only way that such declarations would make sense is if they're 
> inside scopes with their own names so that they can be referred 
> to via those names (e.g. inside a struct or template) or if 
> they aren't in separate scopes and have unique names (which 
> would mean giving them names other than b and c rather than 
> trying to scope them). I fail to see why what you're 
> complaining about here would even be useful.
>
> Now, the fact that it's a bit of a pain to give each of those 
> enums a unique name can certainly be annoying, and that's a 
> problem with static foreach in general, but I don't understand 
> why creating an extra scope like you're trying to do here would 
> be at all useful outside of a function. What are you really 
> trying to do here?
>
> - Jonathan M Davis

Let me demonstrate why it's useful with just this unmaintainable 
piece of code:

```
final class ClassName : SoapBinding, Interface
{
   public:
   final:
   this()
   {
     super();
   }
    import __stdtraits = std.traits;
    static foreach (member; __traits(derivedMembers, Interface))
   {
     mixin
     (
       mixin("(__stdtraits.ReturnType!" ~ member ~ ").stringof") ~
       " " ~
       member ~
       "(" ~
         mixin("parameters!" ~ member) ~
       ") { /* Do stuff ... */ }"
     );
   }
}
```

Woud be so much more maintainable if I could have each statement 
into a variable that could be maintained properly.


More information about the Digitalmars-d mailing list