;; next : {'up, 'down} number list-of-number -> number ;; Purpose: select the next floor where the elevator should stop (define (next dir cf demands) (printf "~s ~s ~s ~n" dir cf demands) (cond ((eq? dir 'up) (up-controller cf (demands-going-down cf demands) (demands-going-up cf demands))) ((eq? dir 'down) (down-controller cf (demands-going-down cf demands) (demands-going-up cf demands))) (else (error 'next "impossible")))) ;; up-controller : number list-of-number list-of-number -> number ;; Purpose: select the next floor where the elevator should stop ;; first consider upwards, then downwards direction (define (up-controller cf downs ups) (cond ((cons? ups) (smallest ups)) ((cons? downs) (largest downs)) (else cf))) ;; down-controller : number list-of-number list-of-number -> number ;; Purpose: select the next floor where the elevator should stop ;; first consider downwards, then upwards direction (define (down-controller cf downs ups) (cond ((cons? downs) (largest downs)) ((cons? ups) (smallest ups)) (else cf))) ;; demands-going-up : number list-of-number -> list-of-number ;; Purpose: filter out all those numbers from demands that are larger than cf (define (demands-going-up cf demands) (cond ((empty? demands) empty) (else (local ((define the-rest (demands-going-up cf (rest demands)))) (cond ((> (first demands) cf) (cons (first demands) the-rest)) (else the-rest)))))) ;; demands-going-down : number list-of-number -> list-of-number ;; Purpose: filter out all those numbers from demands that are smaller than cf (define (demands-going-down cf demands) (cond ((empty? demands) empty) (else (local ((define the-rest (demands-going-down cf (rest demands)))) (cond ((< (first demands) cf) (cons (first demands) the-rest)) (else the-rest)))))) ;; smallest : ne-list-of-number -> number ;; Purpose: find the smallest number in a non-empty list of numbers (define (smallest nelon) (cond ((empty? (rest nelon)) (first nelon)) (else (min (first nelon) (smallest (rest nelon)))))) ;; largest : ne-list-of-number -> number ;; Purpose: find the largest number in a non-empty list of numbers (define (largest nelon) (cond ((empty? (rest nelon)) (first nelon)) (else (max (first nelon) (smallest (rest nelon))))))