Question

I need to write a function that determines if the given list is a pair of elements. The program will simply respond #t if the list contains exactly two elements or #f if it does not, such that:

(zipper? '((a 1)(b 2))) => #t

and

(zipper? '((foo 100)(bar 2 3))) => #f

I'm still fairly new to Scheme so any help would be much appreciated! Thanks!

Was it helpful?

Solution

It isn't clear if the "correct" input for the procedure is an arbitrary list or a two-element list. If it's strictly a two-element list, this will work:

(define (is-two-element-list? lst)
  (and (list? lst)
       (= (length lst) 2)))

(define (zipper? lst)
  (and (is-two-element-list? lst)
       (is-two-element-list? (first lst))
       (is-two-element-list? (second lst))))

… And if it's an arbitrary-length list whose elements we want to check, this will work in Racket, using andmap:

(define (zipper? lst)
  (andmap is-two-element-list? lst))

If you are not using Racket, then this solution using every will work in any interpreter with SRFIs:

(require srfi/1)

(define (zipper? lst)
  (every is-two-element-list? lst))

Either way, notice that the trick was defining the is-two-element-list? procedure, which verifies the two-element-list property, after that we can apply it as needed.

OTHER TIPS

Think of it this way. If the zipper list is '() then the answer is #t. If the zipper list is not '() then if the first element is two elements and the rest is another zipper?, then return #t.

(define (zipper? list)
  (or (null? list)
      (and (= 2 (length (car list)))
           (zipper? (cdr list)))))

or maybe you mean:

(define (zipper? list)
  (or (not (pair? list))
      (and (= 2 (length list))
           (zipper? (list-ref list 0))
           (zipper? (list-ref list 1)))))

every element, at any level, has two elements.

> (zipper? '((a 1 2) '(b)))
#f
> (zipper? '(a b))
#t
> (zipper? '(((a (b b)) c) (1 2)))
#t
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top