Hello Simon,
Thank you for your reply.

I would use an array if I hadn't the constraint that in a NativeCall class
I can't use a Perl6 Array, just a CArray.
Anyway I couldn't add a CArray to the class, because it would change its
size and I need to pass the reference to that class to a C function.

On Sat, Oct 28, 2017 at 1:58 PM, Simon Proctor <simon.proc...@gmail.com>
wrote:

> Here's my very naive way of doing it.
>
> class A does Positional {
>       has $.a0 is rw;
>       has $.a1 is rw;
>       has $.a2 is rw;
>       has $.a3 is rw;
>       has $.a4 is rw;
>       has $.a5 is rw;
>       has @!arr;
>
>       method TWEAK {
>         @!arr[0] := $.a0;
>         @!arr[1] := $.a1;
>         @!arr[2] := $.a2
> <https://maps.google.com/?q=2%5D+:%3D+$.a2&entry=gmail&source=g>;
>         @!arr[3] := $.a3
> <https://maps.google.com/?q=3%5D+:%3D+$.a3&entry=gmail&source=g>;
>         @!arr[4] := $.a4;
>         @!arr[5] := $.a5;
>       }
>       multi method elems() { 6 }
>       multi method AT-POS( $index ) {
>               return @!arr[$index];
>       }
>       multi method ASSIGN-POS( $index, $new ) {
>               @!arr[$index] = $new;
>       }
> }
>
> On Sat, 28 Oct 2017 at 09:45 Fernando Santagata <nando.santag...@gmail.com>
> wrote:
>
>> Hello,
>>
>> I was trying to write a NativeCall interface to a C library, but I
>> stumbled upon a problem (https://stackoverflow.com/
>> questions/44266457/array-of-structs-as-an-attribute-of-a-
>> perl-6-nativecall-struct).
>> The best way to solve that problem would be to add a new keyword to the
>> NativeCall module, which I think is quite hard, so I'm trying a less fancy
>> alternative.
>>
>> The problem itself looks like this: I have a class with a bunch of
>> elements which I would like to access as an array (I can't use a Perl6
>> Array in a NativeCall class).
>>
>> Reducing the problem to the bare bones, my class looks like
>>
>> Class A {
>>   has $.a0 is rw;
>>   has $.a1 is rw;
>>   has $.a2 is rw;
>>   has $.a3 is rw;
>>   has $.a4 is rw;
>> }
>>
>> My first attempt was to use meta methods to access the attributes:
>>
>> class A does Positional {
>>   has $.a0 is rw;
>>   has $.a1 is rw;
>>   has $.a2 is rw;
>>   has $.a3 is rw;
>>   has $.a4 is rw;
>>   method AT-POS($index) is rw {
>>     my $a = A.^attributes(:local)[$index];
>>     $a.get_value(self);
>>   }
>> }
>>
>> This works if I just need to read the values, but if I needed to write
>> them I should use the set_value metamethod:
>>
>> $a.set_value(self, $value);
>>
>> The detail I miss is: how do I know whether the AT-POS method has been
>> called to produce an rvalue or an lvalue?
>>
>> The second attempt was to use a Proxy object:
>>
>> class A does Positional {
>>   has $.a0 is rw;
>>   has $.a1 is rw;
>>   has $.a2 is rw;
>>   has $.a3 is rw;
>>   has $.a4 is rw;
>>   method AT-POS(::?CLASS:D: $index) is rw {
>>     my $a = A.^attributes(:local)[$index];
>>     Proxy.new(
>>       FETCH => method () { $a.get_value(self) },
>>       STORE => method ($value) { $a.set_value(self, $value) }
>>     );
>>   }
>> }
>>
>> sub MAIN
>> {
>>   my A $a .= new;
>>   $a.a0 = 0;
>>   $a.a1 = 1;
>>   say $a[0];
>>   say $a[1];
>>   say $a[2];
>>   $a[0] = 42;
>>   say $a[0];
>> }
>>
>> But this program just hangs.
>> When run in the debugger I get this:
>>
>> >>> LOADING Proxy.p6
>> + Exception Thrown
>> | Died
>> + Proxy.p6 (25 - 29)
>> | }
>> |
>> | sub MAIN
>> | {
>> |   my A $a .= new;
>>
>> I'm clueless here.
>> What am I doing wrong?
>> Can anyone help?
>>
>> Thank you!
>>
>> --
>> Fernando Santagata
>>
>


-- 
Fernando Santagata

Reply via email to