;; --------------------------------------------------------- ;; Basic constanst: (define WIDTH 50) (define HIGHT 160) (define RADIUS 20) (define DELTA 10) (define X (quotient WIDTH 2)) ;; off-set : num -> num (define (off-set y) (+ y DELTA (* 2 RADIUS))) (define Y:RED (off-set (- RADIUS))) (define Y:YEL (off-set Y:RED)) (define Y:GRN (off-set Y:YEL)) ;; A light is (make-light posn color) (define-struct light (center color)) (define RED:LIGHT (make-light (make-posn X Y:RED) RED)) (define YEL:LIGHT (make-light (make-posn X Y:YEL) YELLOW)) (define GRN:LIGHT (make-light (make-posn X Y:GRN) GREEN)) ;; --------------------------------------------------------- ;; successor : light -> light (define (successor l) (cond [(eq? RED:LIGHT l) GRN:LIGHT] [(eq? GRN:LIGHT l) YEL:LIGHT] [(eq? YEL:LIGHT l) RED:LIGHT])) ;; --------------------------------------------------------- ;; current-state : light (define current-state GRN:LIGHT) ;; init : -> void ;; effect: display all colors, then start with green (define (init) (start WIDTH HIGHT) (turn-on RED:LIGHT) (turn-on YEL:LIGHT) (turn-on GRN:LIGHT) (sleep 1) (turn-off RED:LIGHT) (turn-off YEL:LIGHT) (set! current-state GRN:LIGHT)) ;; next : -> void ;; effect: change current state to its successor and switch lights (define (next) (turn-off current-state) (set! current-state (successor current-state)) (turn-on current-state)) ;; make-on/off : draw clear -> (light -> void) (define (make-on/off draw clear) (lambda (l) (let ((p (light-center l)) (c (light-color l))) (clear p RADIUS c) (draw p RADIUS c)))) ;; turn-on : light -> void ;; effect: draw full disk (define turn-on (make-on/off draw-solid-disk clear-circle)) ;; turn-off : light -> void ;; effect: blank out and draw circle (define turn-off (make-on/off draw-circle clear-solid-disk)) (define (cycle) (next) (sleep 1) (cycle)) (init) (cycle)