8章3節の練習問題とか
any-predとevery-predを自分で定義しなさい、ということなので、やってみた。
(define my-any-pred (lambda args (lambda (x) (cond ((null? args) #f) (((car args) x) #t) (else ((apply my-any-pred (cdr args)) x)))))) (define my-every-pred (lambda args (lambda (x) (cond ((null? args) #t) (((car args) x) ((apply my-every-pred (cdr args)) x)) (else #f)))))
で、使ってみた。
gosh> ((my-any-pred odd? positive?) -2) #f gosh> ((my-any-pred odd? positive?) -5) #t gosh> ((my-every-pred) 5) #t gosh> ((my-every-pred positive? integer?) -2) #f gosh> ((my-every-pred positive? integer?) 5) #t
complementをcut構文使って定義しようとしたけど、できなかった><
(define my-complement (lambda (pred) (cut (not (pred <>)))))
そっか、<>がcutと同じ深さに無いとダメなんだよね。
(cut (関数合成 not pred) <>)
みたいなのだったらOKなのかな。
追記
ゴチャゴチャ考えてみたら、
(関数合成 not pred)
の部分をlambda式で置き換えて
(lambda (x) (not (pred x)))
にすればよくね?
とか思ってたら、本に書いてある回答よりも冗長になったというオチ。
(cut (lambda (x) (not (pred x))) <>)
とかありえんし!