Yes, the size of the object would change. In any case, I can't use a Perl6 Array in a NativeCall class, so the point is moot.
The problem is that that C library exposes an API, whose main structure contains an array of five pointers to another kind of struct. It is not a pointer to an array of pointers, but just an array of pointers. So the struct contains an array of five pointers. (Does it sound weird? :-) I really don't know why they designed that data container that way) On Sat, Oct 28, 2017 at 9:47 PM, Simon Proctor <simon.proc...@gmail.com> wrote: > Ahhh.. Hmmmm. Even with the array as a private variable? > > On Sat, 28 Oct 2017, 8:41 pm Fernando Santagata, < > nando.santag...@gmail.com> wrote: > >> 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 >>> <https://maps.google.com/?q=5%5D+:%3D+$.a5&entry=gmail&source=g>; >>> } >>> 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 >> > -- Fernando Santagata