Re: [perl #131599] [BUG] "my %hash is default([])" misbehaves

2017-06-19 Thread Michael Schaap via RT
Thanks for explaining, I see why it does what it does now, more or 
less.  Using .elems is an elegant workaround.

But if not a bug, I'd say it's at least an LTA; Rakudo should warn that 
you're shooting yourself in the foot.

On 19-Jun-17 18:30, Brad Gilbert via RT wrote:
> There does appear to be a bug, but I'd argue that it is in your code.
>
>  my %sum{Int} is default([]);
>
> That line of code sets the default for all elements when they are first 
> accessed
> to the very same instance of an Array.
>
> Remove the `is default([])`
>
> To stop the warnings that would then happen you could use `andthen`
>
>  say (1..10).grep(-> $i { %sum{$i} andthen $_ == 2 });
>
> Or you could use `.elems`
>
>  say (1..10).grep(-> $i { %sum{$i}.elems == 2 });
>
> The way Moose in Perl 5 works around this is to give it a subroutine that will
> produce the value to set it to then rather than a value. (slight 
> simplification)
>
> Basically Perl 6 dutifully did what you asked it to, and there currently
> isn't as far as I know, a way to do what you intended.
>
> So this isn't really a bug report, but a feature request.
> The new feature may very well use the same syntax you have provided.
>
> On Sun, Jun 18, 2017 at 4:52 PM, Michael Schaap
>  wrote:
>> # New Ticket Created by  Michael Schaap
>> # Please include the string:  [perl #131599]
>> # in the subject line of all future correspondence about this issue.
>> # https://rt.perl.org/Ticket/Display.html?id=131599 >
>>
>>
>> #!/usr/bin/env perl6
>>
>> my %sum{Int} is default([]);
>> %sum{4}.push: "1+3";
>> %sum{4}.push: "2+2";
>>
>> say (1..10).grep(-> $i { %sum{$i} == 2 });
>> # Expected output: (4)
>> # Actual output: (1 2 3 4 5 6 7 8 9 10)
>>
>> %sum{3}.push: "1+2";
>>
>> say (1..10).grep(-> $i { %sum{$i} == 2 });
>> # Expected output: (4)
>> # Actual output: ()
>>
>> say %sum;
>> # Expected output: {3 => [1+2], 4 => [1+3 2+2]}
>> # Actual output: {}
>>
>> say %sum{4};
>> # Expected output: [1+3 2+2]
>> # Actual output: [1+3 2+2 1+2]
>>
>> # Without "is default([])" it works fine, except that the "grep" complains
>> # (rightly) about uninitialized values.
>>
>> # % perl6 --version
>> # This is Rakudo version 2017.04.3 built on MoarVM version
>> 2017.04-53-g66c6dda
>> # implementing Perl 6.c.



Re: [perl #131599] [BUG] "my %hash is default([])" misbehaves

2017-06-19 Thread Michael Schaap
Thanks for explaining, I see why it does what it does now, more or 
less.  Using .elems is an elegant workaround.


But if not a bug, I'd say it's at least an LTA; Rakudo should warn that 
you're shooting yourself in the foot.


On 19-Jun-17 18:30, Brad Gilbert via RT wrote:

There does appear to be a bug, but I'd argue that it is in your code.

 my %sum{Int} is default([]);

That line of code sets the default for all elements when they are first accessed
to the very same instance of an Array.

Remove the `is default([])`

To stop the warnings that would then happen you could use `andthen`

 say (1..10).grep(-> $i { %sum{$i} andthen $_ == 2 });

Or you could use `.elems`

 say (1..10).grep(-> $i { %sum{$i}.elems == 2 });

The way Moose in Perl 5 works around this is to give it a subroutine that will
produce the value to set it to then rather than a value. (slight simplification)

Basically Perl 6 dutifully did what you asked it to, and there currently
isn't as far as I know, a way to do what you intended.

So this isn't really a bug report, but a feature request.
The new feature may very well use the same syntax you have provided.

On Sun, Jun 18, 2017 at 4:52 PM, Michael Schaap
 wrote:

# New Ticket Created by  Michael Schaap
# Please include the string:  [perl #131599]
# in the subject line of all future correspondence about this issue.
# https://rt.perl.org/Ticket/Display.html?id=131599 >


#!/usr/bin/env perl6

my %sum{Int} is default([]);
%sum{4}.push: "1+3";
%sum{4}.push: "2+2";

say (1..10).grep(-> $i { %sum{$i} == 2 });
# Expected output: (4)
# Actual output: (1 2 3 4 5 6 7 8 9 10)

%sum{3}.push: "1+2";

say (1..10).grep(-> $i { %sum{$i} == 2 });
# Expected output: (4)
# Actual output: ()

say %sum;
# Expected output: {3 => [1+2], 4 => [1+3 2+2]}
# Actual output: {}

say %sum{4};
# Expected output: [1+3 2+2]
# Actual output: [1+3 2+2 1+2]

# Without "is default([])" it works fine, except that the "grep" complains
# (rightly) about uninitialized values.

# % perl6 --version
# This is Rakudo version 2017.04.3 built on MoarVM version
2017.04-53-g66c6dda
# implementing Perl 6.c.


Re: [perl #131599] [BUG] "my %hash is default([])" misbehaves

2017-06-19 Thread Brad Gilbert via RT
There does appear to be a bug, but I'd argue that it is in your code.

my %sum{Int} is default([]);

That line of code sets the default for all elements when they are first accessed
to the very same instance of an Array.

Remove the `is default([])`

To stop the warnings that would then happen you could use `andthen`

say (1..10).grep(-> $i { %sum{$i} andthen $_ == 2 });

Or you could use `.elems`

say (1..10).grep(-> $i { %sum{$i}.elems == 2 });

The way Moose in Perl 5 works around this is to give it a subroutine that will
produce the value to set it to then rather than a value. (slight simplification)

Basically Perl 6 dutifully did what you asked it to, and there currently
isn't as far as I know, a way to do what you intended.

So this isn't really a bug report, but a feature request.
The new feature may very well use the same syntax you have provided.

On Sun, Jun 18, 2017 at 4:52 PM, Michael Schaap
 wrote:
> # New Ticket Created by  Michael Schaap
> # Please include the string:  [perl #131599]
> # in the subject line of all future correspondence about this issue.
> # https://rt.perl.org/Ticket/Display.html?id=131599 >
>
>
> #!/usr/bin/env perl6
>
> my %sum{Int} is default([]);
> %sum{4}.push: "1+3";
> %sum{4}.push: "2+2";
>
> say (1..10).grep(-> $i { %sum{$i} == 2 });
> # Expected output: (4)
> # Actual output: (1 2 3 4 5 6 7 8 9 10)
>
> %sum{3}.push: "1+2";
>
> say (1..10).grep(-> $i { %sum{$i} == 2 });
> # Expected output: (4)
> # Actual output: ()
>
> say %sum;
> # Expected output: {3 => [1+2], 4 => [1+3 2+2]}
> # Actual output: {}
>
> say %sum{4};
> # Expected output: [1+3 2+2]
> # Actual output: [1+3 2+2 1+2]
>
> # Without "is default([])" it works fine, except that the "grep" complains
> # (rightly) about uninitialized values.
>
> # % perl6 --version
> # This is Rakudo version 2017.04.3 built on MoarVM version
> 2017.04-53-g66c6dda
> # implementing Perl 6.c.



Re: [perl #131599] [BUG] "my %hash is default([])" misbehaves

2017-06-19 Thread Brad Gilbert
There does appear to be a bug, but I'd argue that it is in your code.

my %sum{Int} is default([]);

That line of code sets the default for all elements when they are first accessed
to the very same instance of an Array.

Remove the `is default([])`

To stop the warnings that would then happen you could use `andthen`

say (1..10).grep(-> $i { %sum{$i} andthen $_ == 2 });

Or you could use `.elems`

say (1..10).grep(-> $i { %sum{$i}.elems == 2 });

The way Moose in Perl 5 works around this is to give it a subroutine that will
produce the value to set it to then rather than a value. (slight simplification)

Basically Perl 6 dutifully did what you asked it to, and there currently
isn't as far as I know, a way to do what you intended.

So this isn't really a bug report, but a feature request.
The new feature may very well use the same syntax you have provided.

On Sun, Jun 18, 2017 at 4:52 PM, Michael Schaap
 wrote:
> # New Ticket Created by  Michael Schaap
> # Please include the string:  [perl #131599]
> # in the subject line of all future correspondence about this issue.
> # https://rt.perl.org/Ticket/Display.html?id=131599 >
>
>
> #!/usr/bin/env perl6
>
> my %sum{Int} is default([]);
> %sum{4}.push: "1+3";
> %sum{4}.push: "2+2";
>
> say (1..10).grep(-> $i { %sum{$i} == 2 });
> # Expected output: (4)
> # Actual output: (1 2 3 4 5 6 7 8 9 10)
>
> %sum{3}.push: "1+2";
>
> say (1..10).grep(-> $i { %sum{$i} == 2 });
> # Expected output: (4)
> # Actual output: ()
>
> say %sum;
> # Expected output: {3 => [1+2], 4 => [1+3 2+2]}
> # Actual output: {}
>
> say %sum{4};
> # Expected output: [1+3 2+2]
> # Actual output: [1+3 2+2 1+2]
>
> # Without "is default([])" it works fine, except that the "grep" complains
> # (rightly) about uninitialized values.
>
> # % perl6 --version
> # This is Rakudo version 2017.04.3 built on MoarVM version
> 2017.04-53-g66c6dda
> # implementing Perl 6.c.