Task

Create a data structure and the associated methods to define and manipulate a deck of   playing cards.

The deck should contain 52 unique cards.

The methods must include the ability to:

   make a new deck
   shuffle (randomize) the deck
   deal from the deck
   print the current contents of a deck 
Each card must have a pip value and a suit value which constitute the unique value of the card.

Related tasks:

 Card shuffles
 Deal cards_for_FreeCell
 War Card_Game
 Poker hand_analyser
 Go Fish


(defconstant +suits+
  '(club diamond heart spade)
  "Card suits are the symbols club, diamond, heart, and spade.")
 
(defconstant +pips+
  '(ace 2 3 4 5 6 7 8 9 10 jack queen king)
  "Card pips are the numbers 2 through 10, and the symbols ace, jack,
queen and king.")
 
(defun make-deck (&aux (deck '()))
  "Returns a list of cards, where each card is a cons whose car is a
suit and whose cdr is a pip."
  (dolist (suit +suits+ deck)
    (dolist (pip +pips+)
      (push (cons suit pip) deck))))
 
(defun shuffle (list)
  "Returns a shuffling of list, by sorting it with a random
predicate. List may be modified."
  (sort list #'(lambda (x y)
                 (declare (ignore x y))
                 (zerop (random 2)))))