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:
: > 
: >   # Add entropy to your hash
: >   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

Reply via email to