練習問題 P.101 any-pred, every-pred

any-pred は1つでも真になれば #t
真の要素が見つからないまま、リストの最後になれば#f


every-pred は1つでも真になれば #f
真の要素が見つからないまま、リストの最後になれば#t
(ただし、最初から空リストなら #f)


と思ったが、
それは前のページで説明されている any と every だった..


本文読んでいるときから違いが良く分からんなーと思っていたけど、
よくよく読んでみたら、any, every はリスト中の要素を対象とする。
any-pred, every-pred は述語自体が複数あるということだった。


ついでなので、自己定義の any と every も載せておきます。

(define (any pred)
  (define (any-job pred lis)
    (cond ((null? lis) #f)
          ((pred (car lis)) #t)
          (else (any-job pred (cdr lis)))))
  (lambda (lis)
    (any-job pred lis)))


(define (every pred)
  (define (every-job pred lis)
    (cond ((null? lis) #t)
          ((pred (car lis)) (every-job pred (cdr lis)))
          (else #f)))
  (lambda (lis)
    (if (null? lis)
        #f
        (every-job pred lis))))


(define (any-pred pred . opt-pred)
  (define (any-pred-job pred-lis x)
    (cond ((null? pred-lis) #f)
          (((car pred-lis) x) #t)
          (else (any-pred-job (cdr pred-lis) x))))
  (lambda (x)
    (any-pred-job (cons pred opt-pred) x)))


(define (every-pred pred . opt-pred)
  (define (every-pred-job pred-lis x)
    (cond ((null? pred-lis) #t)
          (((car pred-lis) x) (every-pred-job (cdr pred-lis) x))
          (else #f)))
  (lambda (x)
    (every-pred-job (cons pred opt-pred) x)))