Hi Bill,

a) The documentation about semicolons in contexts that call for Arrays or Lists is very sparse and *should* be improved.

This can best be done by raising an issue on https://github.com/perl6/doc

If you would do this it would help the community.

b) You have said that the documentation I pointed you to was about Arrays, and that you had raised an issue about push(). However, if you will see that push in the context you were using was assuming a List/Array context. Hence you were getting lists, and lists of lists.

So it seems to me that the issue is the same not different.

Richard

On 01/05/2019 19:43, William Michels wrote:
Hello Richard and thank you for your comment,

I'm not sure I have clarity on the use of semicolons in Perl 6. Most
references in the documentation refer to the semicolon as a statement
separator. Many references point out where semicolons are optional
(e.g. particular lines within blocks).

Now for multi-dimensional arrays, I see commas being used as
'dimensional-separators", and semicolons used to slice a
multi-dimensional array.

 From RosettaCode:

# Multi dimension arrays may be predeclared which constrains the
indices to the declared size:
my @dim5[3,3,3,3,3];
#Creates a preallocated 5 dimensional array where each branch has 3
storage slots and constrains the size to the declared size.
#It can then be accessed like so:
@dim5[0;1;2;1;0] = 'Perl 6';
say @dim5[0;1;2;1;0]; # Perl 6

https://rosettacode.org/wiki/Multi-dimensional_array#Perl_6

Seems to be different from the push() issue. --B.


On Sun, Apr 14, 2019 at 12:39 AM 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[dot]youtube[dot]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