Domanda

I have a small issue with an assigned programming task in Scheme. We were given the task to make a function that returns only the values in a pair structure that meet the requirements of a given predicate. They are also to be returned in the same pair structure, simply with the offending entries removed. So far my code is like follows

(define (keep-if-all ia pred ls)
 (cond
  ((null? ls) null)
  ((pair? ls)
   (cons
    (keep-if-all pred (car ls))
    (keep-if-all pred (cdr ls))))
  ((pred ls) ls)
  (else null)))

The problem is that else returns null and thus replaces the value with null rather than removes it.

For example

(keep-if-all odd? (list 1 2 3 (cons 4 4) (list 1 2 3 4 5)))

returns

(1 () 3 (()) (1 () 3 () 5))

rather than the desired

(1 3 () (1 3 5))

A poke in the right direction would be much appreciated

È stato utile?

Soluzione

Just add another if there,

(define (keep-if-all pred ls)
 (cond
  ((null? ls) '())
  ((pair? ls)
     (let ((x (keep-if-all pred (car ls))))
       (if (or (not (null? x))                ; if something's left of (car ls)
               .... )                         ;     or if it was a pair,
        (cons x (keep-if-all pred (cdr ls)))  ;   then, include x in the output
        .... )))                              ;   else, don't include x in the output
  ((pred ls) ls)
  (else '())))

Now it works as expected:

(keep-if-all odd? (list 1 2 3 (cons 4 4) (list 1 2 3 4 5)))
;Value 15: (1 3 () (1 3 5))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top