; the version on p. 79
(define list-ref1 
  ; : (-> ((list datum) natural) datum)
  (lambda (ls n)
    (cond
      ((<= (length ls) n)
       (error "list-ref: Index"
	      n
	      "out of range for list"
	      ls))
      ((zero? n) (car ls))
      (else (list-ref1 (cdr ls)
		       (sub1 n))))))


;; on p. 80 following is list-ref-helper
(define speedy-list-ref
  (lambda (ls n)
    ; REQUIRES: (> (length ls) n)
    (if (zero? n)
	(car ls)
	(speedy-list-ref
	 (cdr ls) (sub1 n)))))

(define careful-list-ref
  (lambda (ls n)
    (cond
      ((<= (length ls) n)
       (error "list-ref: Index"
	      n
	      "out of range for list"
	      ls))
      (else (speedy-list-ref ls n)))))

; - Program 3.7, pg. 81 -
; count while going down list
(define list-ref
  (lambda (ls n)
    (cond
      ((null? ls)
       (error "list-ref: Index"
	      n
	      "out of range for list"
	      ls))
      ((zero? n) (car ls))
      (else (list-ref (cdr ls)
		      (sub1 n))))))