プログラミングGaucheの練習問題(every-pred,any-pred)
プログラミングGaucheの8.3の練習問題(P101)をしてみる。
lambda式を返せばよいということはすぐわかりましたが、可変長で渡される手続きをどう適用していくのか少し悩みました。より後ろのページ9.5節にあった「名前つきlet」を使って実装しました。
every-pred
複数の述語から、それらの述語が全てマッチすれば#tを返す新たな述語をつくる。述語のリストを前から適用していき、全てが真なら真を返す。
(define (every-pred . pred-lis) (lambda (x) (let every-pred-loop ((preds pred-lis)) (cond [(null? preds) #t] [((car preds) x ) (every-pred-loop (cdr preds))] [else #f] ))))
any-pred
複数の述語から、それらの述語のいずれかがマッチすれば#tを返す新たな述語をつくる。述語のリストを前から適用していき、いずれかが真なら真を返す。
(define (any-pred . pred-lis) (lambda (x) (let any-pred-loop ((preds pred-lis)) (cond [(null? preds) #f] [((car preds) x ) #t] [else (any-pred-loop (cdr preds)) ]))))
上記の定義により述語を作って試してみる。
(define positive-integer? (every-pred integer? positive? ) ) (define positive-or-zero? (any-pred positive? (lambda(x) (= x 0) ) ) ) (print (positive-integer? 0) ) (print (positive-integer? 4) ) (print (positive-integer? 4.5) ) (print (positive-integer? -2) ) (print (positive-or-zero? 0) ) (print (positive-or-zero? 3) ) (print (positive-or-zero? -2) )
- >
#f #t #f #f #t #t #f