HaloO, Daniel Ruoso wrote: > So... > > class A { has $.a; method inc { $.a++ } }; > $a = A.new( a => 0); > $b = $a; > $b.inc(); > $a.inc(); > say $a.a; # 2 > say $b.a; # 2 > > Will work as expected. Depends a bit on one's expectations :) So infix:<=> has shallow copy semantics. IIRC, there was once an 'is deep' trait. Otherwise one has to implement multi infix:<=> (Any $lhs, A $rhs) { $lhs.STORE($rhs.clone); # or .cow if that's not automatic } >> But either the HOW, the WHAT or both of $fp have to change > > That is true So, even though the WHICH stays the eqv check has to change: $a = A.new( a => 0); # your class A $b = A.new( a => 0); $a === $b; # False, but $a eqv $b; # True because of snapshot semantic $b does Point; $a eqv $b; # False because HOW or WHAT is different BTW, is WHICH globally unique? Or is that also an implementation detail? The snapshot check is of course type aware: class B { has $.a; method inc { $.a++ } }; $a = A.new( a => 0); # your class A $b = B.new( a => 0); # same structural type $a eqv $b; # False because of type mismatch Funnily this implies we also need a version of eqv that uses like or duck semantics. But this seems to be foreseen. Could someone post the signature to use for eqv() to make $a and $b to compare equal structurally here? Is it eqv($a, $b, :(like A, like A))? Perhaps that can be abbreviated to eqv($a, $b, :like)? Or even infix:<like> with the rational that this always is a test not a modifying call like infix:<does>. But I would like to reserve infix:<like> for a type check without subsequent canonical value comparison. That is continuing from above $b.inc; $a like $b; # still true even though $a.a != $b.a Or the structural type test is similar to .does $a .like: $b; >> BTW, an interesting question is if a typed >> binding could become invalid: >> subset AntiPoint of Any where {not .^does(Point)} >> my AntiPoint $ap := $fp; # fine for now >> $fp does Point; # now $ap is bound to a Point which >> # violates the AntiPoint constraint > > This is a composition error that generates an exception. It even > provides enough information for a compile-time error. Where is it raised? In the '$fp does Point;' statement with the error "can't compose role Point because of AntiPoint binding to $ap"? How would that change if the line read my AntiPoint $ap = $fp; # or with real assignment # after the declaration Would it say "can't compose role Point because of AntiPoint reference in $ap"? How far does that reach? I mean does the meta object system know about the constraints of all bindings and stored references to an object? Regards, TSa. -- "The unavoidable price of reliability is simplicity" -- C.A.R. Hoare 1 + 2 + 3 + 4 + ... = -1/12 -- Srinivasa RamanujanThread Previous | Thread Next