(defun make-guess (lower-bound upper-bound) (let ((guess (+ (random (- upper-bound lower-bound)) lower-bound)) (response nil)) ;; (format t "Lower bound: ~d; upper bound ~d~%" lower-bound upper-bound) (format t "How about ~d? Too high (2)? Too low (1)? Or am I right (0)?~%" guess) (setq response (read-line)) (cond ((string-equal response "2") (too-high guess lower-bound upper-bound)) ((string-equal response "1") (too-low guess lower-bound upper-bound)) ((string-equal response "0") (format t "I am so smart!~%")) (t (format t "Eh?") (make-guess lower-bound upper-bound))))) (defun too-high (guess lower-bound upper-bound) (cond ((= guess lower-bound) (format t "Cheater!~%") (make-guess lower-bound (1+ upper-bound))) (t (make-guess lower-bound (1- guess))))) (defun too-low (guess lower-bound upper-bound) (cond ((= guess (1- upper-bound)) (format t "Cheater!~%") (make-guess (1- lower-bound) upper-bound)) (t (make-guess (1+ guess) upper-bound)))) (defun play-guessing-game () (let ((lower-bound 0) (upper-bound 1000)) (format t "Think of a number between ~d and ~d~%" lower-bound upper-bound) (make-guess lower-bound upper-bound)))