- 606 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:12:56 ]
- リストから、n番目の要素を削除して、その削除した要素を返す関数を書きました。
まず下のような感じで書いたのですが、これだと、nが0の場合にエラーになります。 (define (remove-at! ls n) (let loop((prev '()) (rest ls) (count n)) (if (zero? count) (begin (set-cdr! prev (cdr rest)) (car rest)) (loop rest (cdr rest) (- count 1))))) それで、nが0の場合は別に処理を入れてみたのですが、破壊的操作で、リストの先頭を削除するのがどうしてもわかりません。 どう書けばいいでしょうか? (define (remove-at! ls n) (cond ((null? ls) '()) ((zero? n) (let ((tmp (car ls))) (set-cdr! ls (cdr ls)) ;; ここがダメ tmp)) (else (let loop((prev '()) (rest ls) (count n)) (if (zero? count) (begin (set-cdr! prev (cdr rest)) (car rest)) (loop rest (cdr rest) (- count 1)))))))
|

|