develooper Front page | perl.perl6.users | Postings from June 2020

Re: an error I don't understand

Thread Previous
From:
Marcel Timmerman
Date:
June 27, 2020 18:05
Subject:
Re: an error I don't understand
Message ID:
c3bdd541-4941-10c6-9b13-366de2552f34@gmail.com
Hi Brad,

> I don't know why you are getting an error.
>
> But I think that this is one case where you should be writing `BUILD` 
> instead of `TWEAK`.
> Note though that you can only have one `BUILD` or `TWEAK` per class.
A quick test showed to me that it doesn't matter if I use BUILD or 
TWEAK. Besides this, I tried this construct before without the TWEAK or 
BUILD submethods and the assignment generated the same errors.

To answer your question below I just want to have an assignment to 
another typed variable which works for all variables but not the CStruct 
variable. Like below;

my cairo_path_data_point_t $p1 = $another-path-data-point;

I must also mention that it becomes awkward when such a variable is 
provided as an argument to some method. Binding will generate also such 
message.

In the mean time I made a small program which didn't generate errors, 
see below
---
use v6;
use NativeCall;

class cairo_path_data_point_t is repr('CStruct') is export {
   has num64 $.x;
   has num64 $.y;
}

my cairo_path_data_point_t $d1 .= new( :x(1e0), :y(2e0));
my cairo_path_data_point_t $d2 = $d1;

note "d2: ", $d2.perl;            # d2: cairo_path_data_point_t.new(x => 
1e0, y => 2e0)
---

and this is what I want.... I now need a Crystal Ball to find me the 
answer of the problems I ran into :-\

Well, at least the error is weird to warn me that I cannot assign a 
variable to another of the same type.

Regards,
Marcel
>
> ---
>
> Or maybe you want a multi method `new` instead?
>
>     multi method new ( :$native-object! ) {
>         samewith( x => $native-object.x, y => $native-object.y )
>     }
>
> Assuming that `x` and `y` are actually public attributes you could 
> pull them out of the object in the signature.
>
>     multi method new ( :$native-object! (:$x, :$y) ) {
>         samewith( :$x, :$y )
>     }
>
> If you need to throw out other public attributes, add `*%`
>
>     multi method new ( :$native-object! (:$x, :$y, *%) ) {
>         samewith( :$x, :$y )
>     }
>
> ---
>
> Honestly I do not understand why you are passing in an already 
> constructed object, and I don't know anything about it either.
>
> If you gave us answers for those two questions, we may be able to help 
> you better.
>
>
> On Sat, Jun 27, 2020 at 10:56 AM Marcel Timmerman <mt1957@gmail.com 
> <mailto:mt1957@gmail.com>> wrote:
>
>     Hi,
>
>     I am getting an error and don't know why it happens, it might even
>     be a
>     bug. It is about an assignment to a CStruct variable.
>
>     The structure is defined like;
>
>     class cairo_path_data_point_t is repr('CStruct') is export {
>        has num64 $.x;
>        has num64 $.y;
>
>        submethod TWEAK ( :$native-object ) {
>          $!x = $native-object.x;
>          $!y = $native-object.y;
>        }
>     }
>
>
>     The error is generated when typed variables are used (below, $x is
>     also
>     a cairo_path_data_point_t);
>
>     my cairo_path_data_point_t $p1 = $x;
>
>     or
>
>     my cairo_path_data_point_t $p1 =
>     cairo_path_data_point_t.new(:native-object($x));
>
>     but not with
>
>     my cairo_path_data_point_t $p1 .= new(:native-object($x));
>
>     or
>
>     my $p1 = $x;
>
>     After which all fields in the structure are happely accessable
>     using $p1!
>
>
>     The error is
>
>     Type check failed in assignment to $p1; expected
>     cairo_path_data_point_t
>     but got cairo_path_data_point_t.new(x => 0e0, y => 0e0)
>
>
>     Raku version: 2020.06-7-gf1960baa9 built on MoarVM version
>     2020.06-6-gbf6af07de
>     implementing Raku 6.d.
>
>     The content of the structure does not matter, I've seen it with other
>     structures too.
>
>     Regards,
>     Marcel
>


Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About