In many programming languages,
when we pass the number n to the array which the length is equal or less than n, we get an exception.
The following is the example of C:
int main(void){
int hoge[] = {0,1,2,3};
printf("%d", hoge[3]); // output: 3
printf("%d", hoge[4]); // get a warning
return 0;
}
We can implement this kind of exception in Scheme by using the procedure length which is introduced in SICP 2.2.1.
The code will be as follows:
; returns the length of a list
(define (length li)
(define (length-iter n iter-li)
(if (null? iter-li)
n
(length-iter (+ n 1) (cdr iter-li))))
(length-iter 0 li))
; check if the value passed to the list is valid
(define (cdr-chk-err li n)
(cond ((or (> n (length li)) (= n (length li)))
(error "Invalid value passed to the list. "))))
(define (list-ref n)
(lambda (x)
(cdr-chk-err x n)
(if (= n 0)
(car x)
((list-ref (- n 1)) (cdr x)))))
This works correctly.
(define l1 (list 1 2 3 4)) ((list-ref 3) l1) ; returns 4 ((list-ref 4) l1) ; error!