(define (reversed-digits n) (cond ((<= n 0) '()) (else (cons n (reversed-digits (- n 1)))))) (define (digits n) (reverse (reversed-digits n))) ;; test digits (digits 10) (digits 0) ;; Removes every occurance of symbol s from the list l (define (remove s l) (cond ((null? l) '()) ((eq? s (car l)) (remove s (cdr l))) (else (cons (car l) (remove s (cdr l)))))) ;; test remove (remove 3 '(0 1 2 3 4 5)) (remove 0 '(0 1 2 3 4 5)) (remove 9 '(0 1 2 3 4 5)) ;; draws and returns k random symbols from the list l (define (draw k l) (cond ((<= k 0) '()) ((null? l) '()) (else (let ((s (list-ref l (random (length l))))) (cons s (draw (- k 1) (remove s l))))))) (draw 5 (digits 55)) (define (number-to-rank n) (cond ((eq? n 1) 'A) ((eq? n 11) 'J) ((eq? n 12) 'Q) ((eq? n 13) 'K) (else n))) (define (number-to-suit n) (cond ((eq? n 1) 'C) ((eq? n 2) 'D) ((eq? n 3) 'H) ((eq? n 4) 'S) (else n))) ;; make-card creates a dotted pair that represents the card of a given numerical rank and suit. (define (make-card n suit) (cons (number-to-rank n) (number-to-suit suit))) ;; generate-suit returns a list that contains 13 cards in the specified suit. (define (generate-suit suit) (map (lambda (x) (make-card x suit)) (digits 13))) ;; test generate-suit (generate-suit 'H) (generate-suit 3) (define *deck* (append (generate-suit 'C) (generate-suit 'D) (generate-suit 'H) (generate-suit 'S))) (define (deal) (draw 5 *deck*)) (deal)