Thread overview
Why does this work?
Jun 23, 2014
h_zet
Jun 23, 2014
VonGrass
Jun 23, 2014
hane
Jun 24, 2014
h_zet
Jun 24, 2014
bearophile
Jun 24, 2014
bearophile
Jun 24, 2014
Meta
Jun 23, 2014
Mason McGill
Jun 23, 2014
Mason McGill
Jun 23, 2014
bearophile
June 23, 2014
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?
June 23, 2014
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

June 23, 2014
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)"

}
June 23, 2014
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.
  }
June 23, 2014
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.
June 23, 2014
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
June 24, 2014
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!
June 24, 2014
h_zet:

> Problem solved, Thank you so much!

I don't think it's solved. There are probably bugs worth reporting here.

Bye,
bearophile
June 24, 2014
> 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
June 24, 2014
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?