(define (fold c z xs)
   (cond ((null? xs) z)
         (else (fold c (c (car xs) z) (cdr xs)))))
 
(define (comp f g) (lambda (x)
  (f (g x))))
 
(define (cons1 x) (lambda (y)
  (cons x y)))
 
(define (filter p xs)
  ((fold (lambda (x k)
           (if (p x) (comp k (cons1 x)) k))
         (lambda (x) x)
         xs)
   '()))
 
(display (filter (lambda(x)(= (remainder x 2) 0)) (list 1 2 3 4 5)))
#|
(define (foldd c z xs)
   (cond ((null? xs) (z '()))
         (else (foldd c (c (car xs) z) (cdr xs)))))
 
(define (comp f g) (lambda (x)     ; ((comp f g) x)
  (f (g x))))
 
(define (cons1 x) (lambda (y)      ; ((cons1 x) y)
  (cons x y)))
 
(define (filter p xs)
  (foldd (lambda (x k)
           (if (p x) (comp k (cons1 x)) k))
         (lambda (x) x)
         xs))
 
(display (filter (lambda(x)(= (remainder x 2) 0)) (list 1 2 3 4 5)))
|#