Re: [S29] pick on other things than junctions

```On Tue, Apr 05, 2005 at 02:38:05PM +0200, Ingo Blechschmidt wrote:
: Hi,
:
: Trey Harris wrote:
: > In a message dated Mon, 4 Apr 2005, Ingo Blechschmidt writes:
: >> What does pick return on hashes? Does it return a random value or a
: >> random pair? (I suppose returning a pair is more useful.)
: >
: > I'd assume in all cases that pick returns an *alias*, and in the case
: > of hashes, an alias to the pair:
: >
: >   for 1..\$entropy_thresshold {
: >       %hash.pick.value *= rand \$scribble_factor;
: >   }
:
: I like that, too. So:
:   my @array = <a b c d>;
:   my \$elem  = @array.pick;
:   \$elem     = "z"; # \$elem now "z", @array unchanged
:
:   my @array = <a b c d>;
:   my \$elem := @array.pick;
:   \$elem     = "z"; # \$elem now "z", @array changed
:                    # (any(@array) eq "z" now true)```
```
But what should we call "pick without replacment"?  .peck?

Unfortunately @array.=pick isn't what you want.  It would reduce the
array to one element.  On the other hand, if .pick takes an argument
saying how many to pick, then maybe

@array.=pick([EMAIL PROTECTED])

gives you a random shuffle.  Unfortunately,

@array.=pick(@array - 1)

won't tell you which one it left out.

: Same for hashes:
:   my %hash = (a => 1, b => 2);
:   my \$pair = %hash.pick;
:   \$pair = ...; # %hash unchanged
:
:   my %hash = (a => 1, b => 2),
:   my \$pair := %hash.pick;
:   \$pair = ...; # %hash changed

I'm not sure that works.  We don't quite have pairs as first class
containers.  Binding would try to use a pair as a named argument, and
would fail unless the key happened to be 'pair', which it isn't in this
case.  However, if you were to say,

my Pair \$pair := %hash.pick;

then it has a better chance of working, presuming someone has the gumption
to write .pick on hashes, which doesn't look entirely trivial to do right.

Larry
```