• 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))