Maybe a given block then? I generally go for brute force first.

On Sat, 28 Oct 2017, 9:21 pm Fernando Santagata, <nando.santag...@gmail.com>
wrote:

> 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
>

Reply via email to