Common Lisp and Clojure both provide a built-in nth
function for retrieving the nth element in a list. Surprisingly enough Scheme (MIT Scheme at least) doesn't that I'm aware of.
Fortunately nth
is super simple to implement in a recursive fashion:
(define (nth n l) (if (or (> n (length l)) (< n 0)) (error "Index out of bounds.") (if (eq? n 0) (car l) (nth (- n 1) (cdr l)))))
After checking to make sure that the index n
isn't greater than the length of the list l
or less than 0 the function checks to see if n
is 0. If it is then it simply returns the first item in l
with car
. Otherwise nth
is called again with n - 1
and the tail of l
, retrieved with cdr
.
seshbaugh ~% scheme --load nth.scm ... ;Loading "nth.scm"... done 1 ]=> (nth 3 '(1 2 3 4 5)) ;Value: 4
I'm reasonably certain that this function is tail recursive; so it should work just fine, albeit slowly, for very long lists.