(脱線)member? を改造してみた
member? は lat? が #f になる場合はすべてのS式に対して評価されない
例えばこんな感じ。
(member? 'aaa '(bbaab ccc (ddd bbb aaa) bbb)) ; #f
member? を memberX? として再定義してみた。
(define memberX? (lambda (a lat) (cond ((null? lat) false) ((eq? a (car lat)) true) ((not (atom? (car lat))) (memberX? a (car lat))) (else (memberX? a (cdr lat)))))) (memberX? 'aaa '(bbaab ccc (aaa bbb aaa) bbb)) ; #t
でも、これって member? との関連性が全くなくなっちゃうな。
たとえば、member? の定義が少し変わっても memberX? は変更しなくても
大丈夫なようにしたほうがいいんじゃないかしら。
もしかしてこういうやり方はふつうしないのかな?
自分でいろいろ試すもうまくいかず
いろいろ調べてたら以下のサイトで紹介されていた flat を見つけました。
参考;http://d.hatena.ne.jp/kobapan/20080921/1221991957
引数を flat にして member? に渡せば。。。
(define append (lambda (a b) (if (null? a) b (cons (car a) (append (cdr a) b))))) (define flat (lambda (x) (cond ((null? x) '()) ((atom? x) x) ((atom? (car x) ) (cons (car x) (flat (cdr x)))) (else (append (flat (car x)) (flat (cdr x))))))) (define memberXX? (lambda (a lat) (cond ((null? lat) false) ((not (lat? lat)) (member? a (flat lat))) (else (member? a lat))))) (memberXX? 'aaa '(zzz ccc bbb)) (memberXX? 'aaa '(zzz ccc aaa)) (memberXX? 'aaa '(zzz ccc (aaa bbb www) bbb)) ; #f ; #t ; #t
できたー。
こんなかんじでいいのかな?
COMMENT: AUTHOR: moremagic IP: 219.165.77.111 date: 2013-06-16T23:32:12.000Z
なるほど!たのしみです!
COMMENT: AUTHOR: ayato0211 IP: 180.0.101.7 date: 2013-06-16T13:46:21.000Z
5章くらいでその疑問は解消されると思います!
moremagic
2013-06-14