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 <t...@wakelift.de> 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 <l...@dijkmat.nl> wrote: >> > On 5 Feb 2021, at 15:49, Theo van den Heuvel <vdheu...@heuvelhlt.nl> 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.