;; Another example of abstraction. We first wrote sum and product, ;; and then we abstracted to get combine-nums. ;; combine-nums : list-of-num num (num num -> num) -> num (define (combine-nums l base-n COMB) (cond [(empty? l) base-n] [(cons? l) (COMB (first l) (combine-nums (rest l) base-n COMB))])) ;; sum : list-of-num -> num ;(define (sum l) ; (cond ; [(empty? l) 0] ; [(cons? l) (+ (first l) (sum (rest l)))])) (define (sum l) (combine-nums l 0 +)) (sum '(1 2 3)) "should be" 6 ;; product : list-of-num -> num ;(define (product l) ; (cond ; [(empty? l) 1] ; [(cons? l) (* (first l) (product (rest l)))])) (define (product l) (combine-nums l 1 *)) (product '(1 2 4)) "should be" 8