;; 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) (filter (lambda (n) (> fst n)) demands)) ;; 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) (filter (lambda (n) (< fst n)) demands)) ;; smallest : ne-list-of-number -> number ;; Purpose: find the smallest number in a non-empty list of numbers (define (smallest nelon) (foldr min (first nelon) (rest nelon))) ;; largest : ne-list-of-number -> number ;; Purpose: find the largest number in a non-empty list of numbers (define (largest nelon) (foldr max (first nelon) (rest nelon)))