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))) <>)

とかありえんし!