[an error occurred while processing this directive]
## cs150: Notes 8

#### Assignments Due

- (extended from 29 January) Before Monday, 5 February: Read GEB,
*Little Harmonic Labyrinth* and GEB, Chapter 5
- Friday, 2 February (beginning of class): Problem Set 2. (Note: Problem
Set 2 will be accepted without penalty or any permission required until
the beginning of class on Monday, 5 February, as long as you promise to
still finish reading GEB Chapter 5 before Monday's class.)

#### Tracing

To enable tracing, evaluate `(require (lib
"trace.ss"))`. (You can put this in your definitions file, like it
is in `poker.scm`.) Then,
(trace *procedure*)

will enable tracing of the procedure. The interpreter will print out a
message corresponding to the entrance (showing the parameters) and exit
(showing the resulting value) of the traced procedure. This is a useful
tool for understanding what is going on when your programs are
evaluated.

#### List Procedures

(define (list? p)
(if (null? p)
#t
(if (pair? p)
(list? (cdr p))
#f)))

(define (sumlist p)
(if (null? p)
0
(+ (car p) (sumlist (cdr p)))))

(define (map f p)
(if (null? p)
null
(cons (f (car p))
(map f (cdr p)))))

Here's an example use of `map` in the `choose-n` procedure from PS2:
(define (choose-n n lst)
;; operands: a number n and a list (of at least n elements)
;; result: evaluates to a list of all possible ways
;; of choosing n elements from lst
(if (= n 0)
(list null)
(if (= (length lst) n)
(list lst)
(append (choose-n n (cdr lst))
**(map (lambda (clst) (cons (car lst) clst)) **
**(choose-n (- n 1) (cdr lst)))))))**

What is the map application expression doing?

(define (list-cruncher base proc combiner lst)
(if (null? lst)
base
(combiner (proc (car lst))
(list-cruncher base proc combiner
(cdr lst)))))
(define (sumlist p)
(list-cruncher _____ ___________________ _____ p))
(define (map f p)
(list-cruncher _______ ______ ______ p))
(define (length p)
(list-cruncher ______ _____________ + p))

Why is it impossible to correctly define `list?` using just `list-cruncher`?

Define `find-closest-number`, a procedure that takes two
parameters, a goal and a list of numbers, and produces the number in the
list numbers list that is closest to goal.