Autrijus Tang wrote:
* deref is now 0-level; $x = 3; $y = \$x; $y++. # now an exception
That is because &postfix<++>:(Ref) doesn't exist, right?
* sub foo (?$x, ?$Inf) {} my $y = (x => 3); foo($y); # binds $x my $z = (+Inf => 3); foo($z); # binds $Inf
Isn't the lhs of => autoquoted? Why does '+Inf' as key bind $Inf?
* Constrained types in MMD position, as well as value-based MMDs, are _not_ resolved in the type-distance phase, but compile into a huge given/when loop that accepts the first alternative. So this: multi sub foo (3) { ... } multi sub foo (2..10) { ... } really means: multi sub foo ($x where { $_ ~~ 3 }) { ... } multi sub foo ($x where { $_ ~~ 2..10 }) { ... } which compiles two different long names: # use introspection to get the constraints &foo<ANONTYPE_1> &foo<ANONTYPE_2> which really means this, which occurs after the type-based MMD tiebreaking phase: given $x { when 3 { &foo<ANONTYPE_1>.goto } when 2..10 { &foo<ANONTYPE_2>.goto } } in the type-based phase, any duplicates in MMD is rejected as ambiguous; but in the value-based phase, the first conforming one wins.
I hope that is a temporary "solution". Usually one would expect 3 beeing a more specific type then 2..10 irrespective of definition sequence.
The upshot is that these are now errors: sub foo ($x) is rw { $x } my $a; foo($a) = 4; # runtime error - assign to constant
I assumed lvalue subs would implicitly return void and an assignment goes to the function slot of the args used in the assignment and subsequent calls with these args return exactly this value. In that respect arrays and hashes are the prime examples of lvalue subs. Other uses are interpolated data, Delauny Triangulation etc. Regards, -- TSa (Thomas Sandlaß)