Define the function list->oos. Develop auxiliary functions as needed.
Solution A solution w/o auxiliaries:
(define (list->oos loos)
(cond ;; [PT 2: for 4 cond clauses matching definition]
[(empty? loos) (make-oos 0 0 0)] ;; [PT 1: for 0 0 0]
[(symbol=? (first loos) 'on) ;; [PT 3: for one correct clause]
(local ((define r (list->oos (rest loos))))
(make-oos (+ (oos-on r) 1) (oos-steady r) (oos-off r)))]
[(symbol=? (first loos) 'steady)
(local ((define r (list->oos (rest loos))))
(make-oos (oos-on r) (+ (oos-steady r) 1) (oos-off r)))]
[(symbol=? (first loos) 'off)
(local ((define r (list->oos (rest loos))))
(make-oos (oos-on r) (oos-steady r) (+ (oos-off r) 1)))]))
or, this one, which is at least conceptually easier:
(define (list->oos l) ;; [PT 1]
(make-oos (count 'on l) (count 'steady l) (count 'off l)))
;; count : Symbol List-of-events -> Number [PT 1]
;; count how often x appears in l [PT 1]
(define (count x l)
(cond ;; [PT 1: 2 cond lines/questions]
[(empty? l) 0]
[else (cond ;; [PT 1: cond sub expression]
[(symbol=? (first l) x) (+ 1 (count x (rest l)))]
[else (count x (rest l))])]))
;; Examples/Tests [PT 1]
(= (count 'on (list 'steady 'steady 'on 'off 'steady)) 1)
Translate your examples for list->oos into tests.
Solution
;; TESTS: [PT 2, each one correctly; 0 if not examples] (equal? (list->oos empty) (make-oos 0 0 0)) (equal? (list->oos (list 'steady 'steady 'off 'on 'steady)) (make-oos 1 3 1))