さかもとのブログ

つらつらと

第9章演習問題(P.112)

(define (delete-1 elt lis . options)
  (if (member elt lis)
      (let-optionals* options ((cmp-fn equal?))
        (define (loop lis)
          (cond [(null? lis) '()]
                [(cmp-fn elt (car lis)) (cdr lis)]
                [else (cons (car lis) (loop (cdr lis)))]))
        (loop lis))
        lis))

memberであるかどうか調べてからやるのは反則だろうか?
ヒント通りやるとこんな感じのはず.

(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)))