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.

Reply via email to