; identifying palindromes

(define (palindrome? xv)
  (let ((len (vector-length xv)))
    (let loop ((left 0) (right (- len 1)))
      (cond ((< right left) #t)
            ((not (equal? (vector-ref xv left)
                          (vector-ref xv right))) #f)
            (else (loop (+ left 1) (- right 1)))))))

(display (palindrome? (vector 1 2 3 4 5 6 7))) (newline)
(display (palindrome? (vector 1 2 3 4 3 2 1))) (newline)

(define (palindrome? xs)
  (let loop ((h xs) (t xs) (front (list)))
    (cond ((null? t) #t)
          ((pair? h)
            (if (pair? (cdr h))
                (loop (cddr h) (cdr t)
                      (cons (car t) front))
                (loop (cdr h) (cdr t) front)))
          ((equal? (car t) (car front))
            (loop h (cdr t) (cdr front)))
          (else #f))))

(display (palindrome? (list 1 2 3 4 5 6 7))) (newline)
(display (palindrome? (list 1 2 3 4 3 2 1))) (newline)