;; The first three lines of this file were inserted by DrRacket. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-intermediate-reader.ss" "lang")((modname week6_m_full) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ()))) ; recall: map ; get-addn : number -> (number -> number) ;(define (get-addn n) ; (local [(define (addn x) (+ x n))] ; addn)) ;(check-expect (addn 3) ; add-n-to-all : number list-of-numbers -> list-of-numbers ; adds n to every number in list (define (add-n-to-all n lon) (local [(define (addn x) (+ n x))] (map addn lon) )) ;(define (add3 x) (+ x 3)) (check-expect (add-n-to-all 5 (list 1 2 3)) (list 6 7 8)) (check-expect (add-n-to-all 0 empty) empty) ; ----------------------- filter ----------------------------- ;; remove-odds : list-of-numbers -> list-of-numbers (define (remove-odds l) (cond [(empty? l) empty] [else (cond [(odd? (first l)) (remove-odds (rest l))] [else (cons (first l) (remove-odds (rest l)))])])) ;; remove-dolls : list-of-symbols -> list-of-symbols (define (remove-dolls l) (cond [(empty? l) empty] [else (cond [(symbol=? 'doll (first l)) (remove-dolls (rest l))] [else (cons (first l) (remove-dolls (rest l)))])])) ; filter : (X -> boolean) list-of-X -> list-of-X ;(define (filter p? l) ; (cond ; [(empty? l) empty] ; [else (cond ; [(not (p? (first l))) (filter p? (rest l))] ; [else (cons (first l) (filter p? (rest l)))])])) (define (keep-odds lon) (filter odd? lon)) (define (remove-dolls-new los) (local [(define (not-is-doll s) (not (symbol=? 'doll s)))] (filter not-is-doll los))) (check-expect (remove-dolls-new (list 'doll 'cheese 'person)) (list 'cheese 'person)) (check-expect (remove-dolls-new (list 'doll 'doll 'person)) (list 'person)) (check-expect (keep-odds (list 1 2 3 4)) (list 1 3)) (check-expect (keep-odds empty) empty) ; ------------------------foldr-------------------------------- ; sum : list-of-numbers -> number ; sums the list of numbers (define (sum l) (cond [(empty? l) 0] [else (+ (first l) (sum (rest l)))])) ; prod : list-of-numbers -> number ; multiplies the list of numbers (define (prod l) (cond [(empty? l) 1] [else (* (first l) (prod (rest l)))])) ; foldr : (number number -> number) number list-of-number -> number ;foldr (symbol list-of-symbols -> list-of-symbols) list-of-symbols list-of-symbols -> list-of-symbols ; foldr: (X Y -> Y) Y list-of-X -> Y ;(define (foldr combine base l) ; (cond ; [(empty? l) base] ; [else (combine (first l) (foldr combine base (restl)))])) (define (sum-new l) (foldr + 0 l)) (define (prod-new l) (foldr * 1 l)) (check-expect (sum-new (list 1 2 3 4)) 10) (check-expect (sum-new empty) 0) (check-expect (prod-new (list 1 2 3 4)) 24) (check-expect (prod-new empty) 1) ; remove-dolls-awesome : list-of-symbols -> list-of-symbols (define (remove-dolls-awesome l) (foldr cons-unless-doll empty l)) ; foldr (symbol list-of-symbols -> list-of-symbols) list-of-symbols list-of-symbols -> list-of-symbols ; cons-unless-doll : symbol list-of-symbols -> list-of-symbols ; returns (cons x y) if x not a doll, y otherwise (define (cons-unless-doll x y) (cond [(symbol=? 'doll x) y] [else (cons x y)])) (check-expect (remove-dolls-awesome (list 'doll 'cheese 'person)) (list 'cheese 'person)) (check-expect (remove-dolls-awesome (list 'doll 'doll 'person)) (list 'person))