Posted to tcl by Zarutian at Fri Nov 16 02:29:09 GMT 2007view pretty

proc create {deck} {
 upvar $deck d
 foreach type {S H D C} {
   foreach value {A 2 3 4 5 6 7 8 9 10 J Q K} {
     lappend cards [set value][set type]
   }
 }
 while {[llength $cards]} {
   set item [lpick $cards]
   lappend d $item
   lremove cards $item
 }
}
proc lpick {list} {
  return [lindex $list [expr int(rand()*[llength $list])]]
}
proc lremove {var item} {
  upvar $var v
  set t [lsearch -exact $v $item]
  set v [lreplace $v $t $t]
}