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

Owner: Nobody
Requestors: alex.jakimenko [at] gmail.com
Cc:
AdminCc:

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



Date: Mon, 10 Oct 2016 16:04:48 +0300
To: rakudobug [...] perl.org
Subject: [LTA] Indexing on a Str throws generic “out of range” message which is less than awesome (“hello”[2])
From: Aleks-Daniel Jakimenko-Aleksejev <alex.jakimenko [...] gmail.com>
Download (untitled) / with headers
text/plain 250b
Code:
say “hello”[2]

Result:
Index out of range. Is: 2, should be in 0..0
  in block <unit> at -e line 1

Actually thrown at:
  in block <unit> at -e line 1



IRC discussion starting here: https://irclog.perlgeek.de/perl6/2016-10-10#i_13370830
RT-Send-CC: perl6-compiler [...] perl.org
Download (untitled) / with headers
text/plain 1.8k
On Mon, 10 Oct 2016 06:05:10 -0700, alex.jakimenko@gmail.com wrote: Show quoted text
> Code: > say “hello”[2] > > Result: > Index out of range. Is: 2, should be in 0..0 > in block <unit> at -e line 1 > > Actually thrown at: > in block <unit> at -e line 1 > > > > IRC discussion starting here: > https://irclog.perlgeek.de/perl6/2016-10-10#i_13370830
I don't get why we throw in this case at all. We don't do it with any of the Positionals: <Zoffix_> m: say $_[42] for 1..1, (1,), [1,], (1,).Seq <camelia> rakudo-moar 60f898: OUTPUT: «Nil␤Nil␤(Any)␤Nil␤» Other than Blob and Uni, which I'd say also break the consistency: <Zoffix_> m: say "".NFD[1] <camelia> rakudo-moar 60f898: OUTPUT: «Index out of range. Is: 1, should be in 0..-1␤ in block <unit> at <tmp> line 1␤␤Actually thrown at:␤ in block <unit> at <tmp> line 1␤␤» <Zoffix_> m: say Blob.new[1] <camelia> rakudo-moar 60f898: OUTPUT: «Index out of range. Is: 1, should be in 0..-1␤ in block <unit> at <tmp> line 1␤␤Actually thrown at:␤ in block <unit> at <tmp> line 1␤␤» The throwage breaks the "everything is a 1-item list" idiom, as I can't safely do $x[1], because it'll explode any time $x is not a non-Stringy Positional. I tried to remove the throwage, but it's blocked by several 6.c tests. And regardless of that, I'm -1 on this ticket. Right now $x[1] throws X::OutOfRange on non-Positionals (even though it shouldn't), but the proposed fix for this ticket would see the possibility of yet another exception in another special case being thrown, all for the sake that *someone new to the language* *assumes* Perl 6 can index strings. IMO such special casing will be a hassle to more normal Perl 6 users than a helpful tip to new Perl 6 users. Just recall how often the Perl-5-ism exceptions get thrown when writing normal Perl 6 code.
I agree with you, but we can do better.

Usually I'm against all perl5 error messages, but I believe that this case is different. I am sure that this is what most people attempt to do at some point. I also know for sure that this is what I did a couple of times when I was starting with Perl 6. I also remember many times people were asking this on the channel.

So here's what I think:
* A FAQ entry can be added. I created a doc issue for this: https://github.com/perl6/doc/issues/1300
* I think that it will be possible to add a compile-time error if you do something like 「‘foo’[2]」. That is, if somebody attempts to index a string literal, then we know for sure that it is wrong (… or at least, the error message will do more good than harm).

On 2017-05-08 09:26:53, cpan@zoffix.com wrote:
Show quoted text
> On Mon, 10 Oct 2016 06:05:10 -0700, alex.jakimenko@gmail.com wrote:
> > Code:
> > say “hello”[2]
> >
> > Result:
> > Index out of range. Is: 2, should be in 0..0
> > in block <unit> at -e line 1
> >
> > Actually thrown at:
> > in block <unit> at -e line 1
> >
> >
> >
> > IRC discussion starting here:
> > https://irclog.perlgeek.de/perl6/2016-10-10#i_13370830
>
>
> I don't get why we throw in this case at all. We don't do it with any
> of the Positionals:
>
> <Zoffix_> m: say $_[42] for 1..1, (1,), [1,], (1,).Seq
> <camelia> rakudo-moar 60f898: OUTPUT: «Nil␤Nil␤(Any)␤Nil␤»
>
> Other than Blob and Uni, which I'd say also break the consistency:
>
> <Zoffix_> m: say "".NFD[1]
> <camelia> rakudo-moar 60f898: OUTPUT: «Index out of range. Is: 1,
> should be in 0..-1␤ in block <unit> at <tmp> line 1␤␤Actually thrown
> at:␤ in block <unit> at <tmp> line 1␤␤»
> <Zoffix_> m: say Blob.new[1]
> <camelia> rakudo-moar 60f898: OUTPUT: «Index out of range. Is: 1,
> should be in 0..-1␤ in block <unit> at <tmp> line 1␤␤Actually thrown
> at:␤ in block <unit> at <tmp> line 1␤␤»
>
> The throwage breaks the "everything is a 1-item list" idiom, as I
> can't safely do $x[1], because
> it'll explode any time $x is not a non-Stringy Positional. I tried to
> remove the throwage, but it's blocked by several 6.c tests.
>
> And regardless of that, I'm -1 on this ticket. Right now $x[1] throws
> X::OutOfRange on non-Positionals (even though it shouldn't), but the
> proposed fix for this ticket would see the possibility of yet another
> exception in another special case being thrown, all for the sake that
> *someone new to the language* *assumes* Perl 6 can index strings. IMO
> such special casing will be a hassle to more normal Perl 6 users than
> a helpful tip to new Perl 6 users. Just recall how often the Perl-5-
> ism exceptions get thrown when writing normal Perl 6 code.




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