プログラミング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