プログラミングGauche p.112 の練習問題

プログラミングGauche

プログラミングGauche

気になったので、ちょっと書いてみました。こんなかんじかなぁ?

(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))
            ([loop (cdr lis)] =>
             (lambda (tail)
               (if (eq? (cdr lis) tail)
                   lis
                   (cons (car lis) tail))))))
    (loop lis)))

p.115 の traverse を使うならこう。

(define delete-1
  (traverse '() car cdr
            (lambda (loop lis)
              (let ((tail (loop (cdr lis))))
                (if (eq? (cdr lis) tail)
                    lis
                    (cons (car lis) tail))))))