0
votes

I am stuck on this question. In fact, the code keeps running and doesn't end. Any suggestions?

(check-expect (all-elements? even? (list 1 2 3)) false)

(check-expect (all-elements? even? (list 2 4 6)) true)

(check-expect (all-elements? odd? (list 1 3 5)) true)

(define (all-elements? predicate lst)

(cond

[(empty? lst) false]

[(predicate (first lst)) true]

[else (all-elements? predicate lst)] ) )

1

1 Answers

1
votes
(define (all-elements? predicate lst)
  (cond ((empty? lst) true)
        ((predicate (first lst)) (all-elements? predicate (cdr lst)))
        (else false)))

Different approach:

;; make `and` as a function
(define (my-and a b) (and a b))

(define (all-elements? predicate args) 
  (foldr my-and #t (map predicate args)))
(all-elements? odd? '(1 3 5))
;; #t

or as a variadic function:

(define (all-elements? predicate . args) 
  (foldr my-and (map predicate args)))

then one can type:

(all-elements? odd? 1 3 5 7 9) ;; #t