「Scheme手習い」本文からは脱線するけど、関数 lat? の定義を見たとき、高階関数 map が使えるんじゃないかと思った。もちろん Gauche にも map は用意されている。
試しに書いてみたのがこれ。
(define all? (lambda (l) (cond ((null? l) #t) ((car l) (all? (cdr l))) (else #f)))) (define lat? (lambda (l) (all? (map atom? l))))
lat? を定義する前に補助関数として all? を定義している(探したけど見つからなかったので自分で定義した)。all? はリストを引数に取って、その要素すべてが真なら #t を返す。
さて、試してみよう。
gosh> (lat? '(bacon and eggs)) #t gosh> (lat? '(bacon (and eggs))) #f
うまくいったようだ。
ただ、この定義だと必ずリストの最後まで要素を見ていくのに対して、もとの再帰による定義だと場合によっては最後まで見る必要がないから、再帰のほうが効率はいいのかもしれない。
member? も map でできるかな?