cress
cress

Reputation: 409

Take out all occurences of element in list

I have this code:

(define remove
  (λ (x y)
    (cond 
          ((null? y) '())
          ((eq? x (car y)) (delete x (cdr y)))
          (else (cons (car y) (delete x (cdr y))))
)))

Input: (remove 'c '(w((x)(c q)(((o))))w))

This will not go inside the inner parenthesis. If I try to remove 'w', it will remove all occurrences of it because they are outside of the parenthesis. So, I can't take out anything from the inside.

Upvotes: 0

Views: 1011

Answers (1)

Óscar López
Óscar López

Reputation: 235994

The solution is a bit more elaborate, you'll have to use the template for traversing a list of lists. Also, is better to use equal? instead of eq?, consult the documentation to understand the differences. A possible implementation follows, I took the liberty of renaming the parameters to something more meaningful:

(define remove
  (λ (ele lst)
    (cond
      ((null? lst) '())           ; if the list is empty then we're done
      ((not (pair? (car lst)))    ; if the first element is an atom
       (if (equal? (car lst) ele) ; check if it's the one we're looking for
           (remove ele (cdr lst)) ; if so we skip over it, eliminating it
           (cons (car lst) (remove ele (cdr lst))))) ; otherwise we add it
      (else (cons (remove ele (car lst))      ; else advance recursion
                  (remove ele (cdr lst))))))) ; over both `car` and `cdr`

Now it works as expected:

(remove 'c '(w ((x) (c q) (((o)))) w))
=> '(w ((x) (q) (((o)))) w)

Upvotes: 1

Related Questions