;; CS 3520 ;; Fall 2001 ;; HW 2 example solution ;; 2.1 (EoPL 1.15, page 24) ;; 1. ; = () | ( . ) ; duple : num object -> list-of-obj (define (duple n x) (cond [(zero? n) '()] [else (cons x (duple (- n 1) x))])) (equal? (duple 0 'a) '()) (equal? (duple 10 'a) '(a a a a a a a a a a)) ;; 2. ; <2-list> = ( ) ; = () | (<2-list> . ) ; invert : list-of-2-list -> list-of-2-list (define (invert lst) (cond [(null? lst) '()] [else (cons (invert/2l (car lst)) (invert (cdr lst)))])) ; invert/2l : 2-list -> 2-list ; Swaps the order of the elements in the given 2-list ; (invert/2l '(a b)) = _(b a)_ (define (invert/2l l) (list (cadr l) (car l))) (equal? (invert/2l '(a b)) '(b a)) (equal? (invert '()) '()) (equal? (invert '((a 1) (a 2) (b 1) (b 2))) '((1 a) (2 a) (1 b) (2 b))) ;; 3. ; filter-in : pred list-of-obj -> list-of-obj (define (filter-in pred lst) (cond [(null? lst) '()] [else (cond [(pred (car lst)) (cons (car lst) (filter-in pred (cdr lst)))] [else (filter-in pred (cdr lst))])])) (equal? (filter-in number? '()) '()) (equal? (filter-in number? '(a 2 (1 3) b 7)) '(2 7)) ;; 4. ; every? : pred list-of-obj -> bool (define (every? pred lst) (cond [(null? lst) #t] [else (and (pred (car lst)) (every? pred (cdr lst)))])) (equal? (every? number? '()) #t) (equal? (every? number? '(a 2 (1 3) b 7)) #f) (equal? (every? number? '(2 7)) #t) ;; 5. ; exists? : pred list-of-obj -> bool (define (exists? pred lst) (cond [(null? lst) #f] [else (or (pred (car lst)) (exists? pred (cdr lst)))])) (equal? (exists? number? '()) #f) (equal? (exists? number? '(a 2 (1 3) b 7)) #t) (equal? (exists? symbol? '(2 7)) #f) ;; 7. ; list-set : list-of-obj num obj -> list-of-obj ; where n must be less than (length lst) (define (list-set lst n x) (cond [(zero? n) (cons x (cdr lst))] [else (cons (car lst) (list-set (cdr lst) (- n 1) x))])) (equal? (list-set '(1) 0 'a) '(a)) (equal? (list-set '(1 2 3) 1 'a) '(1 a 3)) ;; 8. ; product : list-of-obj list-of-obj -> list-of-2-list (define (product lst1 lst2) (cond [(null? lst1) '()] [else (append (product1 (car lst1) lst2) (product (cdr lst1) lst2))])) ; product1 : obj list-of-obj -> list-of-2-list ; Pairs x with each element of lst, creating a ; list of 2-lists. ; (product1 'x '()) = _()_ ; (product1 'x '(a b)) = _((x a) (x b))_ (define (product1 x lst) (cond [(null? lst) '()] [else (cons (list x (car lst)) (product1 x (cdr lst)))])) (equal? (product1 1 '()) '()) (equal? (product1 2 '(a b c)) '((2 a) (2 b) (2 c))) (equal? (product '() '(a b c)) '()) (equal? (product '(1 2 3) '(a b c)) '((1 a) (1 b) (1 c) (2 a) (2 b) (2 c) (3 a) (3 b) (3 c))) ;; 9. ; down : list-of-obj -> list-of-obj (define (down lst) (cond [(null? lst) '()] [else (cons (list (car lst)) (down (cdr lst)))])) (equal? (down '()) '()) (equal? (down '(1 (2) 3)) '((1) ((2)) (3)))