================================================================== Hunk H starts here: ==================================================================
Suppose we want to sum a list of numbers.
We can write a procedure
list-sum to do that, like this:
Scheme> (define (list-sum lis) (if (null? lis) ; if empty list? 0 ; then sum is zero (+ (car lis) ; else sum is car plus the (list-sum (cdr lis))))) ; sum of rest of list #void
Try typing in this example, or cutting and pasting it from this file into your running Scheme system. (If you're reading this in a web browser, that should be easy--just cut the text from the browser window, and paste it into your Scheme window at the prompt.) Cutting and pasting is a lot easier than typing in the whole thing!
This procedure accepts one argument,
lis, which should
be a list. It checks to see whether the list is empty, i.e.,
a null pointer, using the predicate
null?. If so, it
0 as the sum of the elements in the list.
If the list is not empty, the sum of the elements is the sum
car value, plus the sum of the elements in
the rest of the list. In that case,
the car of the list and the
list-sum of the rest of
the list, adds them together, and returns the result.
Try calling this procedure with some lists of numbers, e.g.,
Scheme>(list-sum '(1 2 3)) 6 Scheme>(list-sum '(4 5 6)) 15 Scheme>(list-sum (cons 1 (cons 2 (cons 3 '())))) 6
The addition procedure
+ works with floating-point numbers, not
just integers, so we can call list-sum with a list of floats as well
as integers. (As in most languages, floating point numbers are written
with a period to represent the decimal point. Note that there is
no space between the digits and the decimal point, so that
Scheme won't confuse this with dot notation for lists.)
Scheme>(list-sum '(1 2.2 3.3))
We can modify
list-sum to print out its argument at
each call. Then we can watch the recursion:
Scheme> (define (list-sum lis) (display "in list-sum, lis is: ") (display lis) (newline) ; write a linebreak (if (null? lis) ; if empty list? 0 ; then sum is zero (+ (car lis) ; else it's car plus the (list-sum (cdr lis))))) ; sum of rest of list #void