www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why does this work?

reply "h_zet" <xy_cheng 126.com> writes:
import std.typecons;

auto foo2(R)(R foopara){
     return tuple(foopara, is(R==int));
}

void main(){
     auto tuple(a,b) = foo2(1);
}


I'm expecting some error such as can not act as left value but 
when I compiled this, no error occured. DMD version is DMD64 
v2.065.(ldc2 exited with error function declaration without 
return type)

Why does this work? Or it is a bug?
Jun 23 2014
next sibling parent "VonGrass" <VonGrass sdfsdf.de> writes:
On Monday, 23 June 2014 at 08:30:44 UTC, h_zet wrote:
 import std.typecons;

 auto foo2(R)(R foopara){
     return tuple(foopara, is(R==int));
 }

 void main(){
     auto tuple(a,b) = foo2(1);
 }


 I'm expecting some error such as can not act as left value but 
 when I compiled this, no error occured. DMD version is DMD64 
 v2.065.(ldc2 exited with error function declaration without 
 return type)

 Why does this work? Or it is a bug?
Looks grammaticallyu correct: R type is guessed/infered from the parameter
Jun 23 2014
prev sibling next sibling parent reply "hane" <han.ehit.suzi.0 gmail.com> writes:
On Monday, 23 June 2014 at 08:30:44 UTC, h_zet wrote:
 import std.typecons;

 auto foo2(R)(R foopara){
     return tuple(foopara, is(R==int));
 }

 void main(){
     auto tuple(a,b) = foo2(1);
 }


 I'm expecting some error such as can not act as left value but 
 when I compiled this, no error occured. DMD version is DMD64 
 v2.065.(ldc2 exited with error function declaration without 
 return type)

 Why does this work? Or it is a bug?
You declared a variable template named "tuple" (with unused type parameters a, b) on that line. http://dlang.org/template.html#variable-template I think this is very confusable syntax... void main() { auto tuple(a, b) = foo2(1); writeln(tuple!(int, int)); // writes "Tuple!(int, bool)(1, true)" tuple!(int, int) = foo2(20); writeln(tuple!(int, int)); // writes "Tuple!(int, bool)(20, true)" }
Jun 23 2014
parent reply "h_zet" <xy_cheng 126.com> writes:
On Monday, 23 June 2014 at 09:09:56 UTC, hane wrote:
 On Monday, 23 June 2014 at 08:30:44 UTC, h_zet wrote:
 import std.typecons;

 auto foo2(R)(R foopara){
    return tuple(foopara, is(R==int));
 }

 void main(){
    auto tuple(a,b) = foo2(1);
 }


 I'm expecting some error such as can not act as left value but 
 when I compiled this, no error occured. DMD version is DMD64 
 v2.065.(ldc2 exited with error function declaration without 
 return type)

 Why does this work? Or it is a bug?
You declared a variable template named "tuple" (with unused type parameters a, b) on that line. http://dlang.org/template.html#variable-template I think this is very confusable syntax... void main() { auto tuple(a, b) = foo2(1); writeln(tuple!(int, int)); // writes "Tuple!(int, bool)(1, true)" tuple!(int, int) = foo2(20); writeln(tuple!(int, int)); // writes "Tuple!(int, bool)(20, true)" }
Problem solved, Thank you so much!
Jun 23 2014
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
h_zet:

 Problem solved, Thank you so much!
I don't think it's solved. There are probably bugs worth reporting here. Bye, bearophile
Jun 24 2014
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
 I don't think it's solved. There are probably bugs worth 
 reporting here.
I have not found them, sorry for the noise. Bye, bearophile
Jun 24 2014
parent "Meta" <jared771 gmail.com> writes:
On Tuesday, 24 June 2014 at 10:11:05 UTC, bearophile wrote:
 I don't think it's solved. There are probably bugs worth 
 reporting here.
I have not found them, sorry for the noise. Bye, bearophile
This looks really bad. I thought we weren't going to allow variable templates, just enums and aliases?
Jun 24 2014
prev sibling next sibling parent reply "Mason McGill" <mmcgill caltech.edu> writes:
On Monday, 23 June 2014 at 08:30:44 UTC, h_zet wrote:
 import std.typecons;

 auto foo2(R)(R foopara){
     return tuple(foopara, is(R==int));
 }

 void main(){
     auto tuple(a,b) = foo2(1);
 }


 I'm expecting some error such as can not act as left value but 
 when I compiled this, no error occured. DMD version is DMD64 
 v2.065.(ldc2 exited with error function declaration without 
 return type)

 Why does this work? Or it is a bug?
Strange behavior, indeed. It took me a minute, but I think I know what's going on, and I'm pretty sure it's a bug. D recently introduced a short syntax for function-like templates: enum a(b) = "some_value"; It looks like this also (sort of) works with other qualifiers, which I believe it shouldn't. Here's a minimal example that might be good to put in a bug report: void main() { enum a(x) = "some_value"; // Good. auto b(x) = "some_value"; // Huh? // This also works for `const`, `static`, etc. }
Jun 23 2014
parent "Mason McGill" <mmcgill caltech.edu> writes:
On Monday, 23 June 2014 at 09:29:15 UTC, Mason McGill wrote:
 Strange behavior, indeed. It took me a minute, but I think I 
 know what's going on, and I'm pretty sure it's a bug. D 
 recently introduced a short syntax for function-like templates:

   enum a(b) = "some_value";

 It looks like this also (sort of) works with other qualifiers, 
 which I believe it shouldn't. Here's a minimal example that 
 might be good to put in a bug report:

   void main() {
       enum a(x) = "some_value"; // Good.
       auto b(x) = "some_value"; // Huh?
       // This also works for `const`, `static`, etc.
   }
It looks like I'm mistaken. Variable templates are supposed to exist. Please ignore the previous post.
Jun 23 2014
prev sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
h_zet:

 Why does this work? Or it is a bug?
When you play a little with this code it's easy to see _error_ that should not appear. So there's surely something worth reporting as bug, but I don't yet know what. Bye, bearophile
Jun 23 2014