プログラミング Gauche - 9 章

1 節の練習問題でいきなり詰まりました。cons でリストのコピーを行わずに要素を探します。まったくお手上げだったのですが、Kahua のページに解答が載っていました。


(define (delete-1 elt lis . options)
(let-optionals* options ((cmp-fn equal?))
(define (loop lis)
(cond [(null? lis) '()]
[(cmp-fn elt (car lis)) (cdr lis)]
[else (let ((tail (loop (cdr lis))))
(if (eq? tail (cdr lis))
lis
(cons (car lis) tail)))]))
(loop lis)))
(cdr lis) を引数に再帰呼び出しを行った結果を tail に束縛し、元の (cdr lis) と比較して同一オブジェクトだった場合はそのまま lis を返すようです。こうすれば元ソースのように (car lis) と cons しないため、コピーが発生しないということですね。
こういう、処理を再帰的に行った結果を呼び出し元で評価という考え方がなかなか出来ません。この場合は一致する要素が見つからない場合要素を末尾まで辿り、リストの先頭に戻りながら値を評価していくという処理が直感的に思い浮かばないのですね。とにかく今はサンプルコードをよく読んで、真似して書くしかないですね。