; three more list manipulation exercises (define (mappend f . xss) (apply append (apply map f xss))) (define (make-list n x) (let loop ((n n) (xs '())) (if (zero? n) xs (loop (- n 1) (cons x xs))))) (define xs '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)) (define (task1a xs ns) (reverse (apply append (map make-list ns xs)))) (define (task1b xs ns) (reverse (mappend make-list ns xs))) (display (task1a '(a b c) '(1 2 3))) (newline) (display (task1b '(a b c) '(1 2 3))) (newline) (display (task1a '(d c b a) '(3 0 0 1))) (newline) (display (task1b '(d c b a) '(3 0 0 1))) (newline) (define (task2a xs) (let loop ((xs xs) (odds (list)) (evens (list))) (cond ((null? xs) (append (reverse odds) (reverse evens))) ((odd? (car xs)) (loop (cdr xs) (cons (car xs) odds) evens)) (else (loop (cdr xs) odds (cons (car xs) evens)))))) (define (task2b xs) (append (filter odd? xs) (filter even? xs))) (display (task2a xs)) (newline) (display (task2b xs)) (newline) (define (task3a xs n) (let ((len (length xs))) (list-ref xs (- len n 1)))) (define (task3b xs n) (list-ref (reverse xs) n)) (display (task3a xs 5)) (newline) (display (task3b xs 5)) (newline)