Re: foreach UFCS

2016-03-31 Thread ixid via Digitalmars-d-learn

On Thursday, 31 March 2016 at 13:48:27 UTC, Adam D. Ruppe wrote:
It is trying to look up a name i in global scope, and calling 
writeln on it.


This is why the .name syntax exists: so you can bypass local 
variables with the same name when trying to access a global.


It would compile if you put an `int i;` at the top of your 
module... try it!



Thanks, that makes sense! I had forgotten the global dot syntax. 
That seems like a somewhat sketchy syntax given how little one 
would use it, wouldn't something like:


writeln(i).global;

be much clearer for globals?


Re: foreach UFCS

2016-03-31 Thread Q. Schroll via Digitalmars-d-learn

On Thursday, 31 March 2016 at 13:39:25 UTC, ixid wrote:

What is going on with UFCS and foreach?

foreach(i;0..5).writeln;


This is not UFCS; it is calling writeln on module scope. See 
http://dlang.org/spec/module.html#module_scope_operators


Your code is semantically identical with

foreach (i; 0 .. 5)
{
.writeln; // module scope operator!
}

Furthermre because there is no local variable writeln that could 
be confused with the imported function, the code is identical with


foreach (i; 0 .. 5)
{
writeln;
}


This prints five line breaks.

foreach(i;0..5).i.writeln;

This will not compile.


It does not compile because i is not an identifier at module 
scope. i is a local variable and a hypothetical i at module scope 
(accessible via .i) is not declared, therefore this is an error.



foreach(i;0..5).writeln(i);

This writes out 1 to 4 on separate lines. Is this supposed to 
work? I thought a.b would be rewritten to b(a) with UFCS but 
writeln(foreach(i;0..5)) is nonsensical and does not compile 
and should be the same as foreach(i;0..5).writeln;


It does rewrite. But only if there is an expression beforehand 
the dot. Here it just isn't. The "foreach (i; 0 .. 5)" is not a 
complete expression.


Re: foreach UFCS

2016-03-31 Thread Adam D. Ruppe via Digitalmars-d-learn

On Thursday, 31 March 2016 at 13:39:25 UTC, ixid wrote:

What is going on with UFCS and foreach?


There's no such thing as UFCS on foreach. UFCS only works on 
variables, not a foreach statement.



foreach(i;0..5).writeln;


You can add a line break and optional braces there to see what it 
really is:


foreach(i;0..5) {
   .writeln;
}


It is just an ordinary loop calling writeln 5 times. The leading 
dot in D means "look up in the global namespace".



foreach(i;0..5).i.writeln;


foreach(i; 0 .. 5) {
   .i.writeln;
}

It is trying to look up a name i in global scope, and calling 
writeln on it.


This is why the .name syntax exists: so you can bypass local 
variables with the same name when trying to access a global.


It would compile if you put an `int i;` at the top of your 
module... try it!




foreach(i;0..5).writeln(i);


foreach(i; 0 .. 5) {
   .writeln(i); // leading . just means call global writeln
}




What you're seeing is similar to the Java hoax where people say 
it supports hyperlinking:


public static void main() {
   http://dlang.org/awesome
}


That compiles, but it isn't a link, it just looks like one at 
first.


It is actually a label, "http:", followed by a comment, 
"//dlang.org". Two legal things without whitespace that looks 
like something else at first glance.


Re: foreach UFCS

2016-03-31 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 31 March 2016 at 13:39:25 UTC, ixid wrote:

What is going on with UFCS and foreach?

foreach(i;0..5).writeln;

This prints five line breaks.

foreach(i;0..5).i.writeln;

This will not compile.

foreach(i;0..5).writeln(i);

This writes out 1 to 4 on separate lines. Is this supposed to 
work? I thought a.b would be rewritten to b(a) with UFCS but 
writeln(foreach(i;0..5)) is nonsensical and does not compile 
and should be the same as foreach(i;0..5).writeln;


The compiler interprets it as a foreach without curly braces. 
With curlies it would look like:

foreach(i; 0..5)
{
  .writeln();
}

In this context the dot means the writeln lookup should happen 
from the module level scope.


foreach UFCS

2016-03-31 Thread ixid via Digitalmars-d-learn

What is going on with UFCS and foreach?

foreach(i;0..5).writeln;

This prints five line breaks.

foreach(i;0..5).i.writeln;

This will not compile.

foreach(i;0..5).writeln(i);

This writes out 1 to 4 on separate lines. Is this supposed to 
work? I thought a.b would be rewritten to b(a) with UFCS but 
writeln(foreach(i;0..5)) is nonsensical and does not compile and 
should be the same as foreach(i;0..5).writeln;