;;; -*- Mode:LISP; Readtable:CL; Base:10 -*-

(defun CHOOSE-CARD (hand card-led)
  (let ((suit-led (get-suit card-led))
	(pip-count-led (get-pips card-led)))
  (cond ((singleton-p hand suit-led)		;no choice
	 (get-card suit-led hand))		
	((void-p hand suit-led)			;complete choice
	 (let ((singleton-suits			;which suits are singletons?
		 (subset #'(lambda (suit)
			     (singleton-p hand suit))
			 all-suits))

			      
		       )
	(t					;can choose from >1 cards in suit



(defstruct (HAND (:type (:named-list)

(defvar NORTH (make-instance 'hand))
(defvar SOUTH (make-instance 'hand))
(defvar EAST (make-instance 'hand))
(defvar WEST (make-instance 'hand))
(defvar ALL-PLAYERS (list NORTH EAST SOUTH WEST))
(defvar EACH-SUIT '(2 3 4 5 6 7 8 9 10 J Q K A))
(defvar ALL-SUITS '(OF-SPADES OF-DIAMONDS OF-HEARTS OF-CLUBS))
(defvar *ALL-CARDS* (loop for suit in all-suits collect
			(loop for each-card in each-suit
			      collect (list each-card suit))))
						   

(defun DEAL-HAND ()
  (let ((all-cards (lexpr-funcall 'append *all-cards*)))	;flatten the list of cards into a single list of 52 elements
    (dotimes (i 52.)
      (let ((player (nth (remainder i 4.) all-players))
	    (card (nth (random (- 52 i)) all-cards)))
	(setq all-cards
	      (remove (car (setq player
				 (cons card (eval player))))
		      all-cards))
	(format t "~%Assigning card ~A to ~A.	Deck Length = ~A" card player (length all-cards))))))

			 