Trey Harris skribis 2006-09-01  0:17 (-0700):
> I think these semantics are Almost Right, but yet Entirely Wrong.  The 
> problem is that C<but> reads to me as a *mutating* operator.  That is, I 
> would expect the above code snippet to give me a C<$z.y> of 17, but leave 
> C<$p.y> as 0.  Surely this is what one would expect from analogy of

In the terminology that I have been using, that would not be a mutating
operator, but a copying operator, exactly because the operand $p remains
untouched.

mutating:

    sub foo ($foo is rw) { $foo = sqrt($foo) }
    foo($bar);

    $baz ~~ s/foo/bar/;

copying:

    sub foo ($foo is copy) { $foo = sqrt($foo) }
    foo($bar);

    $baz.subst(/foo/, "bar");

> But yet C<but> with a closure doesn't copy, given the translation above, 
> or even allow modification, since C<given> doesn't either. $_ (in the 
> above case, $p) is set to point to the same object, and so $p.y and $z.y 
> are both modified (or rather, they both refer to the same object, which is 
> modified during assignment).
> In other words, I would actually expect
>   $x but { ... }
> to translate to
>   do given $x -> $_ is clone { ...; $_ }

Agreed that this would be much more useful.

> where C<is clone> is a conjectural way of calling .clone if the argument 
> is an object type but reduces to C<is copy> if the argument is a value 
> type.

Oh, I like "is clone" with these semantics. Though everything is an
object, so you'd need a different explanation...

> I do not think that C<but> should mutate its LHS, regardless what its RHS 
> is.

Agreed, and that's why "$foo but s///" would be a reasonable replacement
for what's currently still "$foo.subst(//, '')". subst doesn't mutate.


Juerd
-- 
http://convolution.nl/maak_juerd_blij.html
http://convolution.nl/make_juerd_happy.html 
http://convolution.nl/gajigu_juerd_n.html

Reply via email to