# New Ticket Created by Elizabeth Mattijsen
# Please include the string: [perl #120025]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org:443/rt3/Ticket/Display.html?id=120025 >
TimToady pointed out that my work on converting [] and {} accesses to sub
calls, rather than method calls, had one more casualty:
*[0]([1, 2, 3])
This is tested in t/spec/S02-types/whatever.t, line 252 and currently fudged.
The suggested change in whatever_curry did not give the right result. And now
I'm in here over my head, so I'm submitting a bug report as promised.
Liz
==============================
[18:53:51] <TimToady> lizmat: did you notice that the subscripting change
broke *.[], *.<>, and *.{}
[18:54:21] <lizmat> TimToady: no, don't think so
[18:54:55] <lizmat> I fudged a number of tests, but I don't recall fudging
any .[] related tests
[18:54:56] <TimToady> nr: my @a = [1,2,3],[4,5,6],[7,8,9]; say @a.map: *.[2]
[18:54:59] <camelia> niecza v24-95-ga6d4c5f: OUTPUT«3 6 9»
[18:55:00] <camelia> ..rakudo 50a57d: OUTPUT«Index out of range. Is: 2,
should be in 0..0 in method <anon> at src/gen/CORE.setting:11768 in any at
src/gen/Metamodel.nqp:2671 in any find_method_fallback at
src/gen/Metamodel.nqp:2659 in any find_method at src/gen/Metamodel.nqp:946
in method reify…»
[19:09:11] <lizmat> jnthn: I'm not sure how to fix .[] etc., any pointers ?
[19:11:03] <lizmat> aaahhhhh… I completely missed that TimToady meant
Whatever.[]
[19:11:16] <lizmat> yes, that broke: simplest case
[19:11:37] <lizmat> nr say *[0](1,2,3)
[19:11:42] <lizmat> nr: say *[0](1,2,3)
[19:11:45] <camelia> niecza v24-95-ga6d4c5f: OUTPUT«Unhandled exception:
Excess arguments to ANON, used 1 of 3 positionals at /tmp/GbWfbqMj6Y line 0
(ANON @ 1)  at /tmp/GbWfbqMj6Y line 1 (mainline @ 3)  at
/home/p6eval/niecza/lib/CORE.setting line 4583 (ANON @ 3)  at
/home/p6eval/niecza/lib/CORE…»
[19:11:45] <camelia> ..rakudo 50a57d: OUTPUT«No such method
'postcircumfix:<( )>' for invocant of type 'Whatever' in block at
/tmp/IcpYdTyvhm:1»
[19:12:04] <jnthn> lizmat: yeah
[19:12:10] <jnthn> lizmat: See Actions.pm, whatever_curry
[19:12:16] lizmat checks
[19:12:31] <jnthn> lizmat: Near the top it OKs infix, prefix and postfix.
Try adding postcircumfix to that list.
[19:13:36] <lizmat> I guess I should follow the callmethod value, right?
[19:14:13] <jnthn> ?
[19:14:25] <jnthn> no, inside whatever_curry
[19:14:38] <jnthn> (nqp::index($past.name, '&infix:')
== 0 ||
[19:14:38] <jnthn> nqp::index($past.name,
'&prefix:') == 0 ||
[19:14:38] <jnthn> nqp::index($past.name,
'&postfix:') == 0 ||
[19:14:42] <lizmat> ahhhh ok
[19:14:42] <jnthn> After that
[19:16:21] <lizmat> compiling and testing
[19:19:26] <TimToady> using index to test for prefix bothers me, since it'll
scan uselessly whenever it doesn't match
[19:20:49] moritz waits for masak++ to construct a bug report that
involves a variable named 'something&infix:bla' which shouldn't be treated as
an infix, but is
[19:21:11] <masak> :P
[19:21:21] <TimToady> well, the == 0 prevents that, but it's just the waste
that bothers me
[19:24:07] <TimToady> it's like using a pile-driver to squash a bug, and
after doing it 50 times, then checking to see if you were successful the first
time
[19:25:33] <moritz> might still be faster than
nqp::eq(nqp::substr($past.name, 0, nqp::chars('&infix:')), '&infix:')
[19:25:38] <TimToady> and a smart index might even have set up Boyer-Moore
tables on the assumption it was going to scan
[19:26:18] <TimToady> sure would be nice if we could write Perl 6 in Perl 6
:)
[19:27:11] <TimToady> then it's just /^ '&' [ in | pre | post 'circum'? ]
fix ':' / :)
[19:27:58] <lizmat> $ perl6 --ll-exception -e 'say *[0](1,2,3)'
[19:27:58] <lizmat> Too many positional parameters passed; got 3 but
expected 1
[19:28:30] <lizmat> full stack trace:
https://gist.github.com/lizmat/6717575
[19:28:35] <lizmat> the error changed
[19:28:54] <lizmat> but I have no idea where that code lives
[19:29:40] <FROGGS> lizmat: maybe look at the ast
[19:30:38] <TimToady> lizmat: src/Perl6/Actions.nqp sez a recursive grep
[19:33:00] <lizmat> sanity check: *[0](1,2,3,4,5) should return the first
element of the (1,2,3,4,5) parcel, right ?
[19:35:02] <TimToady> nr: say (1,2,3,4,5)[0]
[19:35:05] <camelia> rakudo 50a57d, niecza v24-95-ga6d4c5f: OUTPUT«1»
[19:35:08] <TimToady> so it would seem
[19:35:23] <lizmat> right *phew*
[19:35:35] <TimToady> so *() has to be exempted from the postcirumfixes for *
[19:36:05] <TimToady> unless we force people to say (*[0])(1,2,3,45)
[19:36:16] <lizmat> trying that
[19:36:18] <TimToady> if we decide there's a use case for *.()
[19:36:32] <TimToady> which arguably there probably is
[19:36:55] <TimToady> map: *.() should invoke each of a list of invokables
[19:37:23] <TimToady> so I'm inclined to not make *() an exception, and
force people to say (*[0])(1,2,3,4,5) if that's what they mean
[19:38:06] <TimToady> in that case, *[0](1,2,3,4,5) means {
$_.[0].(1,2,3,4,5) } (as a WhateverCode)
[19:38:17] <TimToady> that feels cleaner to me
[19:38:43] <TimToady> the use case for callinging a WhateverCode directly is
minimal
[19:38:50] <TimToady> *inginging
[19:39:14] lizmat feels she no longer has to duck
[19:39:36] <TimToady> nr: say *[0](1,2,3,4,5).WHAT
[19:39:36] <lizmat> as in: this is way over my head
[19:39:38] <camelia> niecza v24-95-ga6d4c5f: OUTPUT«Unhandled exception:
Excess arguments to ANON, used 1 of 5 positionals at /tmp/vU2WHEK3m3 line 0
(ANON @ 1)  at /tmp/vU2WHEK3m3 line 1 (mainline @ 3)  at
/home/p6eval/niecza/lib/CORE.setting line 4583 (ANON @ 3)  at
/home/p6eval/niecza/lib/CORE…»
[19:39:39] <camelia> ..rakudo 50a57d: OUTPUT«No such method
'postcircumfix:<( )>' for invocant of type 'Whatever' in block at
/tmp/uP5CQeMuln:1»
[19:40:06] <TimToady> n: say (*[0](1,2,3,4,5)).WHAT
[19:40:08] <camelia> niecza v24-95-ga6d4c5f: OUTPUT«Unhandled exception:
Excess arguments to ANON, used 1 of 5 positionals at /tmp/zSzO4DEzSC line 0
(ANON @ 1)  at /tmp/zSzO4DEzSC line 1 (mainline @ 3)  at
/home/p6eval/niecza/lib/CORE.setting line 4583 (ANON @ 3)  at
/home/p6eval/niecza/lib/CORE…»
[19:40:28] <TimToady> I guess niecza exempts .() though
[19:41:07] <TimToady> n: say (*(1,2,3,4,5)).WHAT
[19:41:09] <camelia> niecza v24-95-ga6d4c5f: OUTPUT«Unhandled exception:
Unable to resolve method postcircumfix:<( )> in type Whatever at
/tmp/JqJTGWQeaz line 1 (mainline @ 3)  at
/home/p6eval/niecza/lib/CORE.setting line 4583 (ANON @ 3)  at
/home/p6eval/niecza/lib/CORE.setting line 4584 (module-C…»
[19:49:02] <TimToady> n: say ({.(1,2,3,4,5)}).WHAT
[19:49:04] <camelia> niecza v24-95-ga6d4c5f: OUTPUT«(Block)»
[19:49:23] TimToady thinks *(1,2,3,4,5) should mean that
[19:49:39] <TimToady> well, except it's a WhateverCode
[19:51:15] <masak> TimToady: *(1,2,3,4,5) looks like -> &f { &f(1,2,3,4,5)
} to me.
[19:51:40] <masak> oh wait, we're saying the same thing, aren't we?
[19:51:47] <TimToady> yes, though I just wrote it {.()}
[19:52:36] <TimToady> so I flipflopped on my answer to lizmat++ and don't
think .() should be an exception under Whatever
[19:53:06] <lizmat> .oO( lalaalalalala I'm not listening ) :-)
[19:53:49] <TimToady> but you BROKE it! WAAAH! :P
[19:54:07] <lizmat> may I plead insanity ?
[19:54:54] <TimToady> as long as you don't plead ultro-low-frequency EM
[19:55:03] <TimToady> *ultra
[19:55:17] <lizmat> My Hero!
[19:55:55] <TimToady> but in that case someone needs to file a bug
[19:56:16] <lizmat> .oO( I was suddenly reminded of
http://en.wikipedia.org/wiki/My_Hero_(UK_TV_series) )
[19:57:08] TimToady looks around for an anti-hero to file the bug report
for all the wrong reasons...
[20:00:59] <lizmat> I will file one if I can't get it fixed