2005/11/25

昨日はうそを書いていました。
えたいの知れないリストから、どこにあるか分からないアトム(アトムって、実際にはあんまり使わない用語だね)を取り去る deep-rember というプロシージャを勢いで定義してみたんだけど、そんなに簡単な話じゃなかったようです。というわけで、訂正。
(define (deep-rember item list)
(cond ((null? list) '())
((not (pair? (car list)))
(if (equal? item (car list))
(cdr list)
(cons (car list) (deep-rember item (cdr list)))))
(else
(if (equal? item (caar list))
(append (cdar list) (cdr list))
(if (not (pair? (caar list)))
(cons (caar list) (deep-rember item (cons (cdar list) (cdr list))))
(deep-rember item
(append (caar list) (cdar list) (cdr list))))))))
こんなふうな結果が得られる(昨日の定義では、末尾の3が残ってしまう)。
gosh> (deep-rember 3 '(2 (1 4 ((((6))))) (3)))
(2 1 4 6 ())
リスト同士を繋ぐときに append を使っているのは、deep-rember の結果として得られるリストにできるだけ nil を残さないため。nil があると、昨日定義した deep-equal? で、null? を終端条件に使えない。
にしても、もうちょっと整理できないものか。

No comments :