Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

When a hash isn't bound to an optional %-sigilled parameter, something weird ends up in it in Rakudo #2274

Closed
p6rt opened this issue Nov 23, 2010 · 6 comments

Comments

@p6rt
Copy link

p6rt commented Nov 23, 2010

Migrated from rt.perl.org#79642 (status was 'resolved')

Searchable as RT79642$

@p6rt
Copy link
Author

p6rt commented Nov 23, 2010

From @masak

<masak> rakudo​: sub foo($a, %h?) { bar($a, %h) }; sub bar($a, %h?) {
say "alive!" }; foo(42)
<p6eval> rakudo : OUTPUT«Method 'HOW' not found for invocant of class
'Hash'␤ in 'bar' at line 1 [...]
<masak> rakudo​: sub foo($a, %h?) { say %h.WHAT }; foo(42)
<p6eval> rakudo : OUTPUT«Method 'WHAT' not found for invocant of class
'Hash'␤ in 'foo' at line 22​:/tmp/qK5WsYzzEI␤ in main program body at
line 22​:/tmp/qK5WsYzzEI␤»
* masak submits rakudobug
<colomon> masak++
<masak> bug brought to you courtesy of a November being brought back
from the Mostly Dead.

Further experimenting reveals that the %h coming in through &foo
claims to be a Hash, but it has no methods at all, so you can't do
anything with it, not even pass it to &bar.

@p6rt
Copy link
Author

p6rt commented Nov 23, 2010

From @masak

On Mon Nov 22 16​:06​:07 2010, masak wrote​:

<masak> rakudo​: sub foo($a, %h?) { bar($a, %h) }; sub bar($a, %h?) {
say "alive!" }; foo(42)
<p6eval> rakudo : OUTPUT«Method 'HOW' not found for invocant of class
'Hash'␤ in 'bar' at line 1 [...]
<masak> rakudo​: sub foo($a, %h?) { say %h.WHAT }; foo(42)
<p6eval> rakudo : OUTPUT«Method 'WHAT' not found for invocant of class
'Hash'␤ in 'foo' at line 22​:/tmp/qK5WsYzzEI␤ in main program body at
line 22​:/tmp/qK5WsYzzEI␤»
* masak submits rakudobug
<colomon> masak++
<masak> bug brought to you courtesy of a November being brought back
from the Mostly Dead.

Further experimenting reveals that the %h coming in through &foo
claims to be a Hash, but it has no methods at all, so you can't do
anything with it, not even pass it to &bar.

<masak> ah, here's a workaround​:
<masak> rakudo​: sub foo($a, %h = {}) { bar($a, %h) }; sub bar($a, %h?) { say "alive!" }; foo(42)
<p6eval> rakudo : OUTPUT«alive!␤»
<masak> of course.
* masak adds that to the ticket

@p6rt
Copy link
Author

p6rt commented Nov 23, 2010

@masak - Status changed from 'new' to 'open'

@p6rt
Copy link
Author

p6rt commented Oct 8, 2011

From @coke

On Mon Nov 22 16​:06​:07 2010, masak wrote​:

<masak> rakudo​: sub foo($a, %h?) { bar($a, %h) }; sub bar($a, %h?) {
say "alive!" }; foo(42)
<p6eval> rakudo : OUTPUT«Method 'HOW' not found for invocant of class
'Hash'␤ in 'bar' at line 1 [...]
<masak> rakudo​: sub foo($a, %h?) { say %h.WHAT }; foo(42)
<p6eval> rakudo : OUTPUT«Method 'WHAT' not found for invocant of class
'Hash'␤ in 'foo' at line 22​:/tmp/qK5WsYzzEI␤ in main program body
at
line 22​:/tmp/qK5WsYzzEI␤»
* masak submits rakudobug
<colomon> masak++
<masak> bug brought to you courtesy of a November being brought back
from the Mostly Dead.

Further experimenting reveals that the %h coming in through &foo
claims to be a Hash, but it has no methods at all, so you can't do
anything with it, not even pass it to &bar.

Fixed​:

16​:35 < [Coke]> rakudo​: sub foo($a, %h?) { bar($a, %h) }; sub bar($a,
%h?) {say
  "alive!" }; foo(42)
16​:35 -!- pothos_ is now known as pothos
16​:35 <+p6eval> rakudo 88c5a5​: OUTPUT«alive!␤»
16​:35 < [Coke]> rakudo​: sub foo($a, %h?) { say %h.WHAT }; foo(42)
16​:36 <+p6eval> rakudo 88c5a5​: OUTPUT«Hash()␤»

Closable with tests.

--
Will "Coke" Coleda

@p6rt
Copy link
Author

p6rt commented Apr 22, 2012

From @moritz

Now tested in S06-signature/optional.t.

@p6rt
Copy link
Author

p6rt commented Apr 22, 2012

@moritz - Status changed from 'open' to 'resolved'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant