I think he meant doing something like this (with fuller handling for out of
bounds, exceptions throwing, slices, etc):
role Shaped[*@dimensions] {
has @!multipliers =
@dimensions.reverse.produce(&[*])[0..*-2].reverse.Slip, 1;
method AT-POS(*@indices where all @dimensions Z> @indices ) {
self.List::AT-POS( [+] @indices Z* @!multipliers )
}
}
In this way, you could read in serial data with a bit less work by shaping it
after the fact, e.g.
my @foo = $fh.slurp.split($delimiter);
@foo does Shaped[ … ];
> On Feb 5, 2021, at 12:31 PM, Timo Paulssen <[email protected]> wrote:
>
> Shaped Arrays and Native Shaped Arrays already use one contiguous blob to
> store all their data; in Shaped Arrays that's an array of pointers to the
> stored objects, in a Native Shaped Array it'll be like a big array of 32bit
> integers or whatever you have.
>
> Regards
> - Timo
>
> On 05/02/2021 16:48, yary wrote:
>> This got me interested in
>> https://docs.raku.org/language/list#index-entry-Shaped_arrays
>>
>> and I find myself wanting to implement a role "Shaped" and applying it to
>> List, for an immutable shaped list, whose implementation packs its elements
>> for o(1) lookup... on my ever-lengthening to-do list
>>
>> -y
>>
>>
>> On Fri, Feb 5, 2021 at 10:06 AM Elizabeth Mattijsen <[email protected]> wrote:
>> > On 5 Feb 2021, at 15:49, Theo van den Heuvel <[email protected]> wrote:
>> > I cannot seem to find an idiomatic way to get the dimensions of a
>> > multidimensional array,
>> > other than by looking at the size of the first row and column, with
>> > @m[0;*].elems and @m[*;0].elems.
>> > Am I missing something in the docs?
>>
>> If it's a shaped multidimensional array, you can call the .shape method
>>
>> my @a[3;3;3];
>> dd @a.shape; # (3,3,3)
>>
>> If it is not, then your workaround appears the way to do it.