Index: languages/perl6/src/classes/List.pir
===================================================================
--- languages/perl6/src/classes/List.pir	(revision 24193)
+++ languages/perl6/src/classes/List.pir	(working copy)
@@ -55,6 +55,100 @@
     .return (x)
 .end
 
+.sub 'pick' :method
+    .param int count        :optional
+    .param int has_count    :opt_flag
+    .param int repl         :named('repl') :optional
+    .param int has_repl     :opt_flag
+    
+    .local pmc list    
+    
+    if has_count goto choose
+    count = 1
+    
+  choose:
+    unless has_repl goto no_repl
+    list = self.'!pick_replacement'(count)
+    goto ret
+  no_repl:
+    list = self.'!pick_no_replacement'(count)
+  ret:
+    .return(list)
+    
+.end
+    
+
+.sub '!pick_replacement' :method
+    .param int count        :optional
+    .param int has_count    :opt_flag
+    .local pmc values
+    .local int elems, idx
+
+    values = self               # list itself
+    elems  = elements values    # how many in the list
+    
+    .local pmc picks            # list to return
+    .local pmc item
+    $P0 = new 'ResizablePMCArray'
+
+    unless has_count goto list_pick
+    if count == 0 goto end_empty
+
+  list_pick:
+    idx = 'prefix:rand'(elems)
+    $P1 = values[idx]
+    push $P0, $P1
+
+    dec count 
+    if count > 0 goto list_pick
+
+  end_empty:
+    .return 'list'($P0)  
+.end
+
+.sub '!pick_no_replacement' :method    
+    .param int count        :optional    
+    .param int has_count    :opt_flag    
+    .local pmc values    
+    .local int elems, idx
+
+    values = self               # list itself    
+    elems  = elements values    # how many in the list
+
+    .local pmc picks            # list to return    
+    .local pmc item    
+
+    $P0 = new 'ResizablePMCArray'    
+    $P2 = new 'ResizablePMCArray' # already picked indexes - only needed if :repl is off
+  
+    unless count < elems goto too_many
+    unless has_count goto list_pick # if count is not passed, they mean it to be 1
+    if count == 0 goto end_empty
+  
+    goto list_pick
+
+  too_many:
+    count = elems
+  
+  list_pick:
+    idx = 'prefix:rand'(elems)
+    $P1 = values[idx]
+
+    # if $P1 already exists in $P2 and :repl isn't set, goto list_pick
+    $I3 = exists $P2[idx]
+    if $I3 goto list_pick
+
+    push $P0, $P1
+    set $P2[idx], 1
+
+    dec count
+    if count > 0 goto list_pick
+
+  end_empty:
+    .return 'list'($P0)
+
+.end
+
 =back
 
 =cut
