今度は2つの集合の共通部分に関する関数だ。
intersect?
関数 intersect? は、セット s1 と s2 が共通部分を持てば #t を返す。
(use mymodule) (define intersect? (lambda (s1 s2) (cond ((null? s1) #f) ((member? (car s1) s2) #t) (else (intersect? (cdr s1) s2))))) (print (intersect? '(stewed tomatoes and macaroni) '(macaroni and cheese)))
^o^ > gosh -I. intersect_p.scm #t
これを or を使って書くと短くなる。
(use mymodule) (define intersect? (lambda (s1 s2) (cond ((null? s1) #f) (else (or (member? (car s1) s2) (intersect? (cdr s1) s2)))))) (print (intersect? '(stewed tomatoes and macaroni) '(macaroni and cheese)))
ここで誤植発見。cond の1つ目の質問 (null? s1)
に対する値が本(「Scheme手習い」)では nil
になっているけど、これは #f
の間違いだろう。
^o^ > gosh -I. intersect_p2.scm #t
intersect
関数 intersect はセット s1 と s2 の共通部分を返す。
(use mymodule) (define intersect (lambda (s1 s2) (cond ((null? s1) (quote ())) ((member? (car s1) s2) (cons (car s1) (intersect (cdr s1) s2))) (else (intersect (cdr s1) s2))))) (print (intersect '(stewed tomatoes and macaroni) '(macaroni and cheese)))
^o^ > gosh -I. intersect.scm (and macaroni)