;;(require (lib "datatype.ss" "eopl")) (require (lib "eopl.ss" "eopl")) (define-datatype BusRoute BusRoute? (a-BusRoute (name symbol?) (buses (list-of Bus?)) (towns (list-of Town?)))) (define-datatype Bus Bus? (a-Bus (name symbol?) (passengers (list-of Person?)))) (define-datatype Town Town? (a-Town (name symbol?) (busStops (list-of BusStop?)))) (define-datatype BusStop BusStop? (a-BusStop (name symbol?) (waiting (list-of Person?)))) (define-datatype Person Person? (a-Person (name symbol?))) (define (trav br) (cases BusRoute br (a-BusRoute (name buses towns) (+ (trav-buses buses) (trav-towns towns))))) (define (trav-buses lob) (foldl + 0 (map trav-bus lob))) (define (trav-bus b) (cases Bus b (a-Bus (name passengers) (trav-passengers passengers)))) (define (trav-passengers lop) (foldl + 0 (map trav-person lop))) (define (trav-person p) (cases Person p (a-Person (name) 1))) (define (trav-towns lot) 0) (define br1 (a-BusRoute 'Route1 (list (a-Bus 'B45 (list (a-Person 'Dimitrios) (a-Person 'Viera)))) (list (a-Town 'Cambridge (list (a-BusStop 'CentralSquare (list (a-Person 'Jesse) (a-Person 'Matthias)))))))) (trav br1)