DIP 57: static foreach

Dicebot public at dicebot.lv
Tue Mar 11 15:28:47 PDT 2014


On Monday, 10 March 2014 at 15:38:09 UTC, Timon Gehr wrote:
>> I think it can be phrased more universally "ForeachTypeList 
>> symbols must
>> be evaluated as compile-time entities, if it is not possible,
>> implementation-defined compilation error happens".
>> ...
>
> I don't see how this is more universal.

CTFE stands for "Compile-Time Function Evaluation". When you 
don't have functions or expressions (i.e. pure type list) 
referring to it looks very confusing to me and I start guessing 
if you mean some specific CTFE semantics I don't know about or it 
is just a wording for "accessible during compile-time".

Also spec does not say that const-folding happens via CTFE as a 
rule, thus you are exposing implementation details that way.

Looks like your intentions here are same as mine but exact 
phrasing creates misunderstanding :)

>> 5)
>>
>>> For static foreach statements, break and continue are 
>>> supported and
>>> treated like for foreach statements over tuples.
>>
>> It is impossible as far as I understand existing semantics. 
>> Currently
>> placed continue/break refer to created scope and don't stop 
>> iteration
>> over remaining template argument list members. This is not 
>> applicable to
>> generic foreach.
>> ...
>
> This is not 'impossible', it is trivial to implement. Is your 
> point that you would prefer break and continue to affect static 
> foreach expansion?

Impossible in a sense that those are not applicable in 
declaration context. Also break/continue do look weird in absence 
of scope, I don't like it. Would prefer those to either affect 
static foreach expansion or refer to outer loop (compilation 
error if there is none).

>> 6)
>>
>> In "Iterating over members of a scope" example there is a 
>> strange
>> Python-like colon after `static if` condition. Typo? :)
>> ...
>
> Nope. This is a language feature. See:
> http://dlang.org/version.html

What a horrible creation! :O It is first time I see such static 
if syntax in actual D code. Why was it introduced?

> I think the description is actually not detailed enough to 
> warrant this critique. (In particular, it is not clear what 
> 'ref' should do.)
>
> I.e., I think currently the following code is ambiguous:
>
> int y,z;
> static foreach(x;Seq!(y,z)) x = 2;
> // what is the value of y and z now?

With existing foreach y and z will remain int.init
If you change it to be `foreach(ref x; Seq..`, y and z will 
change to 2.

For static foreach I want it to be 2 and `ref x` rejected at 
compilation time as nonsense.


More information about the Digitalmars-d mailing list