二回ループしている点が効率悪いが、テストはパス。
gosh> (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 (if (eq? (delete-1 elt (cdr lis))
(cdr lis))
lis
(cons (car lis) (loop (cdr lis))))]))
(loop lis)))
delete-1
gosh> (let ((data (list 1 2 3 4 5)))
(test* "non-copy delete-1" data (delete-1 6 data) eq?))
test non-copy delete-1, expects (1 2 3 4 5) ==> ok
#
コメント