Skip Menu |
Report information
Id: 124036
Status: open
Priority: 0/
Queue: perl6

Owner: Nobody
Requestors: masak <cmasak [at] gmail.com>
Cc:
AdminCc:

Severity: (no value)
Tag: Bug
Platform: (no value)
Patch Status: (no value)
VM: (no value)



From: Carl Mäsak <cmasak [...] gmail.com>
Date: Tue, 10 Mar 2015 17:12:08 +0100
To: rakudobug [...] perl.org
Subject: [BUG] The compiler shouldn't yell at a call to a subroutine that has been wrapped by a trait in Rakudo
Download (untitled) / with headers
text/plain 1.4k
<Ven> m: sub trait_mod:<is>(&c, :$curried!) { my $arity = &c.arity; &c.wrap(-> |args { args.list.elems == $arity ?? callsame() !! &c.assuming(|args); }); }; sub foo($a, $b) is curried { say $a + $b; }; foo(3, 4); my $c = foo(5); $c(6); <camelia> rakudo-moar f8002f: OUTPUT«===SORRY!=== Error while compiling /tmp/CqAnyz9U98␤Calling 'foo' will never work with argument types (int)␤ Expected: :(Any $a, Any $b)␤at /tmp/CqAnyz9U98:1␤------> ed { say $a + $b; }; foo(3, 4); my $c = ⏏foo(5); $c(6);␤» <Ven> if an "is" wraps a sub, then it probably shouldnt get checked :) * masak can't decide who is right, Ven or Rakudo <masak> probably Ven. * masak submits rakudobug <Ven> :D <masak> Ven: it is seldom this close. congratulations. <Ven> thanks, I guess * psch agrees <psch> m: sub trait_mod:<is>(&c, :$curried!) { my $arity = &c.arity; &c.wrap(-> |args { args.list.elems == $arity ?? callsame() !! &c.assuming(|args); }); }; my &foo = sub ($a, $b) is curried { say $a + $b; }; foo(3)(4) # seeing as this works <camelia> rakudo-moar f8002f: OUTPUT«7␤» <PerlJam> psch++ <psch> but then we can't rebind a normal sub declaration either <psch> which i think was justified with "it would break optimisation" <psch> having the distinction makes "sub foo { }" somewhat magical over "my &foo = sub { }", which is surprising, and with the bit of jnthn++'s FOSDEM talk that i watched yesterday even seems wrong, because "sub foo { }" is supposed to be just a lexical declaration (unless there was more that i missed)
Still same error message (2017.11,HEAD(e5b660e))

On 2015-03-10 09:12:23, masak wrote:
Show quoted text
> <Ven> m: sub trait_mod:<is>(&c, :$curried!) { my $arity = &c.arity;
> &c.wrap(-> |args { args.list.elems == $arity ?? callsame() !!
> &c.assuming(|args); }); }; sub foo($a, $b) is curried { say $a + $b;
> }; foo(3, 4); my $c = foo(5); $c(6);
> <camelia> rakudo-moar f8002f: OUTPUT«===SORRY!=== Error while
> compiling /tmp/CqAnyz9U98␤Calling 'foo' will never work with argument
> types (int)␤ Expected: :(Any $a, Any $b)␤at
> /tmp/CqAnyz9U98:1␤------> ed { say $a + $b; }; foo(3, 4); my $c =
> ⏏foo(5); $c(6);␤»
> <Ven> if an "is" wraps a sub, then it probably shouldnt get checked :)
> * masak can't decide who is right, Ven or Rakudo
> <masak> probably Ven.
> * masak submits rakudobug
> <Ven> :D
> <masak> Ven: it is seldom this close. congratulations.
> <Ven> thanks, I guess
> * psch agrees
> <psch> m: sub trait_mod:<is>(&c, :$curried!) { my $arity = &c.arity;
> &c.wrap(-> |args { args.list.elems == $arity ?? callsame() !!
> &c.assuming(|args); }); }; my &foo = sub ($a, $b) is curried { say $a
> + $b; }; foo(3)(4) # seeing as this works
> <camelia> rakudo-moar f8002f: OUTPUT«7␤»
> <PerlJam> psch++
> <psch> but then we can't rebind a normal sub declaration either
> <psch> which i think was justified with "it would break optimisation"
> <psch> having the distinction makes "sub foo { }" somewhat magical
> over "my &foo = sub { }", which is surprising, and with the bit of
> jnthn++'s FOSDEM talk that i watched yesterday even seems wrong,
> because "sub foo { }" is supposed to be just a lexical declaration
> (unless there was more that i missed)




This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org