Richard Hainsworth <rnhainswo...@gmail.com> wrote:
> A semicolon is the syntax used for multidimensional arrays.
>
> See https://docs.perl6.org/language/subscripts#Multiple_dimensions

Thanks.  I was trying to help Bill with that question, and I couldn't
quite see what was going on there.   You can't really do a web search
on "<computer language>" and ";"  and expect to learn anything.

And reading through that section on multidimensional arrays, it
doesn't immediately leap out why Bill would be seeing this behavior.
It's mostly a discussion of dereferencing complex data structures, not
creating them.   Where it does create multiple levels it uses the
comma.


Richard Hainsworth <rnhainswo...@gmail.com> wrote:
> A semicolon is the syntax used for multidimensional arrays.
>
> See https://docs.perl6.org/language/subscripts#Multiple_dimensions
>
>
> On 14/04/2019 15:07, William Michels via perl6-users wrote:
>> Hello,
>>
>> I've been working through Patrick Michaud's excellent videos from the
>> The Perl Conference 2016. At about 35:45 of the following 2016 video
>> (Part 1 of 2), Patrick discusses arrays:
>>
>> https://www.youtube.com/watch?v=ySch4xpoPA0
>>
>> At this point in the video, Patrick also discusses push() and pop()
>> calls on arrays. For practice I tried pushing and popping strings in
>> the REPL. However, I discovered an unusual property when I misplaced a
>> semicolon during call to push(). See what happens below when a
>> semicolon is included within the parentheses of push():
>>
>> "This is Rakudo version 2018.12 built on MoarVM version 2018.12
>> implementing Perl 6.d."
>>
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries.push("Finland");
>> [UK Spain Slovakia Sweden Finland]
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries.push("Finland";)
>> [UK Spain Slovakia Sweden (Finland) ()]
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries.push("Finland";);
>> [UK Spain Slovakia Sweden (Finland) ()]
>>
>> Misplacing a semicolon within the push() call adds two elements to the
>> array. When I examine these two elements, I see that they are both
>> "List" elements:
>>
>>> @countries[3].WHAT
>> (Str)
>>> @countries[4].WHAT
>> (List)
>>> @countries[5].WHAT
>> (List)
>>
>> Apparently, multiple semicolons within push() will add multiple list
>> elements to the end of the intended array:
>>
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries.push("Finland";;);
>> [UK Spain Slovakia Sweden (Finland) () ()]
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries.push(;;;;;;;);
>> [UK Spain Slovakia Sweden () () () () () () () ()]
>>
>> It is surprising to me that "List" elements are appended to the array
>> with push() as described above. If one tries to add one or more
>> elements via indexing and there 'aren't enough elements' so to speak
>> (by accident or design), the array grows by inserting "Any" elements,
>> not "List" elements:
>>
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries[5] = "Finland";
>> Finland
>>> say @countries
>> [UK Spain Slovakia Sweden (Any) Finland]
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries[6..7] = "Finland", "Norway";
>> (Finland Norway)
>>> say @countries
>> [UK Spain Slovakia Sweden (Any) (Any) Finland Norway]
>>
>> I've briefly checked pop() to see if there are similar issues, but 1)
>> placing a string within the parentheses of pop() will throw an error,
>> and 2) placing a semicolon within the parentheses of pop() will throw
>> an error. However, these error message are slightly different. A
>> string argument to pop() will result in an error that says "Too many
>> positionals passed; expected 1 argument but got 2" while a semicolon
>> argument to pop() will result in an error that says "Too many
>> positionals passed; expected 1 argument but got 3".
>>
>>> my @countries = "UK", "Spain", "Slovakia", "Sweden";
>> [UK Spain Slovakia Sweden]
>>> @countries.pop("Finland")
>> Too many positionals passed; expected 1 argument but got 2
>>    in block <unit> at <unknown file> line 1
>>
>>> @countries.pop(;)
>> Too many positionals passed; expected 1 argument but got 3
>>    in block <unit> at <unknown file> line 1
>>
>>
>> Any help appreciated,
>>
>> Bill.
>>
>> William Michels, Ph.D.
>>
>> PS Thanks to Joe Brenner for talking over this Perl6 code with me.
>

Reply via email to