On 03/20/2013 10:37 PM, Patrick R. Michaud wrote:
On Wed, Mar 20, 2013 at 12:41:41PM -0700, Carl Mäsak wrote:
# New Ticket Created by "Carl Mäsak"
# Please include the string: [perl #117235]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org:443/rt3/Ticket/Display.html?id=117235 >
<masak> just found my heisenbug :)
<masak> yeah, this is a weird one.
<diakopter> run it?
<masak> rn: my $c = [[1]].map({ [ @$_ ] }); $c.push( 42 ); say $c.perl
<p6eval> rakudo 9be4cc, niecza v24-35-g5c06e28: OUTPUT«([1], 42).list.item»
<masak> rn: my $c = [[1]].map({ [ @$_ ] }); $c.unshift( 42 ); say $c.perl
<p6eval> rakudo 9be4cc: OUTPUT«(42,).list.item»
<p6eval> ..niecza v24-35-g5c06e28: OUTPUT«(42, [1]).list.item»
* masak submits rakudobug
<masak> rn: my $c = [[1], [2], [3]].map({ [ @$_ ] }); $c.unshift( 42
); say $c.perl
<p6eval> niecza v24-35-g5c06e28: OUTPUT«(42, [1], [2], [3]).list.item»
<p6eval> ..rakudo 9be4cc: OUTPUT«(42,).list.item»
Niecza is right throughout, of course. The .unshift method adds
elements; it doesn't remove them.
The problem is apparently with sink context, not .unshift. I have a temporary
fix in mind, but can't get to it until Wednesday night or Thursday night.
20:26 <pmichaud> I wonder if the problem is related to sink context.
20:26 <pmichaud> r: my $c = [[1],[2],[3]].map( { $_ } ); $c.unshift(42).say
20:26 <p6eval> rakudo 9be4cc: OUTPUT«42 1 2 3»
20:26 <pmichaud> $c.unshift(42); is being evaluated in sink context.
20:26 <moritz> that might be it
20:27 <pmichaud> r: my $c = [[1],[2],[3]].map( { $_ } ); $c.unshift(42).sink;
say $c.perl;
20:27 <p6eval> rakudo 9be4cc: OUTPUT«(42,).list.item»
20:27 <pmichaud> there ya go.
20:27 <moritz> niecza doesn't implement sink context
20:27 <masak> huh.
20:28 <pmichaud> r: my $c = [[1],[2],[3]].map( { $_ } ); $c.sink; say $c.perl;
20:28 <p6eval> rakudo 9be4cc: OUTPUT«().list.item»
20:29 <moritz> pmichaud: c4083c42f2e63c97254b7a215a858913c4ff4a44 is the
relevant merge commit
20:29 <pmichaud> golfed.
This patch works in this particular case:
diff --git a/src/core/List.pm b/src/core/List.pm
index 84f7eff..964d6f4 100644
--- a/src/core/List.pm
+++ b/src/core/List.pm
@@ -379,8 +379,8 @@ my class List does Positional {
$val;
}
- method sink() {
- self.gimme(*, :sink);
+ method sink(\SELF:) {
+ SELF.gimme(*, :sink) unless nqp::iscont(SELF);
Nil;
}
}
But of course it's not a real fix. Should I apply it?
Cheers,
Moritz