
(define (zip z lst1 lst2)
(if (null? lst1)
'()
(cons
(z (car lst1) (car lst2))
(zip z (cdr lst1) (cdr lst2)))))

(define (compose . f-list)
(cond ((= 1 (length f-list)) (car f-list))
((= 2 (length f-list))
(let ((f (car f-list))
(g (cadr f-list)))
(lambda (x) (f (g x)))))
(else (lambda (x)
((car f-list)
((apply compose (cdr f-list)) x))))))

(define (filter pred lst)
(reverse
(filter-help pred lst '())))

(define (filter-help pred lst res)
(cond ((null? lst) res)
((pred (car lst))
(filter-help pred (cdr lst) (cons (car lst) res)))
(else
(filter-help pred (cdr lst) res))))