On Sun, Nov 06, 2005 at 03:10:40PM +0100, Ingo Blechschmidt wrote:
: Hi,
: 
:     my ($key, $value) = <key val>;
:     my $pair          = ($key => $value);
: 
:     $pair.key = "new";
:     # Should this fail ("cannot modify a constant")?
:     # Should this update $pair.key, but leave $key untouched?
:     # Should this update $pair.key, implicitly updating $key as well?

#2.  => copies $key, or equivalently does COW.

:     $pair.value = "new";
:     # Should this fail ("cannot modify a constant")?
:     # Should this update $pair.value, but leave $value untouched?
:     # Should this update $pair.value, implicitly updating $value
:     # as well?

Likewise #2, I think.

Also, if we provide a way to return a pair instead of a value from a
hash (currently done with the new :%hash<key> syntax), then we can't
have people trying to modify the key of the hash in place unless there's
some way to notify the hash that it has to re-insert the new key, and
that sounds like a big bother for little gain.

: If setting $pair.value changes $value, should rebinding $pair.value
: cause the binding to get destroyed:
: 
:     $pair.value := $some_other_var;
:     $pair.value = "new";
:     # $value unchanged, $some_other_var set to "new"
: 
: If setting $pair.value does not change $value, should binding
: $pair.value to $value do what I mean:
: 
:     $pair.value := $value;
:     $pair.value = "new";
:     # $value changed

I think binding directly to .key or .value is different from what =>
does.  So after

    $pair = $key => $value;

setting $value doesn't change $value, but after

    $pair.value := $value

it does.  We could have an => equivalent that does binding rather than
copying:

    $pair = $key :=> $value;

Of course, that *looks* like we're only binding the key side, so we could
go with

    $pair = $key :> $value;

or

    $pair = $key ::> $value;

Doubtless if we added that, we'd get requests to only bind the key
or the value:

    $pair = $key ::> $value;    # bind both
    $pair = $key :=> $value;    # bind the key
    $pair = $key =:> $value;    # bind the value

These have interesting ramifications when reduced:

    $cons = [::>] @list;
    $cons = [:=>] @list;
    $cons = [=:>] @list;

Probably we'd want to optimize the value-copying variants to not
recopy the tail of the list at each step if possible.

I suppose an argument could be made for => to default to =:>.
In Haskell the correct answer is always ::>, of course, but Haskell
doesn't easily admit to the existence of mutable values.  I think
our pairs are containers, not values.  Maybe \(key => $value) is
how you turn => into ::>, since in the case of an arglist you have
to be able to bind to the original $value.

Or maybe :> is our named arg syntax and => is always a pair.

Larry

Reply via email to