#### Upcoming Schedule

• Monday, 21 September: Chapter 6
• Monday, noon-1:30pm: Help Hours in Thorton Stacks
• Wednesday, 23 September: Problem Set 3
• Friday, 25 September: Chapter 7
• Monday, 28 September: Chapter 8
• Wednesday, 30 September: Problem Set 4
• Friday, 2 October: Exam 2 out
• Wednesday, 7 October: Exam 2 due

### Using Map

Here's a complex example use of list-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 was of choosing n
elements from lst
(if (= n 0)
(list null)
(if (= (list-length lst) n)
(list lst) ; must use all elements
(list-append
(choose-n n (cdr lst)) ;; all possibilities not using first element
(list-map (lambda (clst) (cons (car lst) clst))
(choose-n (- n 1) (cdr lst)))))))
```
What is the list-map application expression doing?

```

(define (map2d f p)
(list-map

_________________________________________
p))

```

### Generalizing List Procedures

 ```(define (list-map f p) (if (null? p) null (cons (f (car p)) (list-map f (cdr p))))) ``` ```(define (list-sum p) (if (null? p) 0 (+ (car p) (list-sum (cdr p))))) ``` ```(define (list-length p) (if (null? p) 0 (+ 1 (list-length (cdr p))))) ``` ```(define (is-list? p) (if (null? p) true (if (pair? p) (is-list? (cdr p)) false))) ```
```(define (list-cruncher baseres carproc combiner p)
(if (null? p) baseres
(combiner
(carproc (car p))
(list-cruncher baseres carproc combiner (cdr p)))))

(define (list-sum p)

(list-cruncher _____ ___________________  _____ p))

(define (list-map f p)

(list-cruncher _______  ______   ______ p))

(define (list-length p)

(list-cruncher ______  _____________ + p))
```
Is it possible to define is-list? using just list-cruncher?

How is list-cruncher similar and different from list-accumulate? (Section 5.4.2)

```(define (list-accumulate f base p)
(if (null? p) base
(f (car p) (list-accumulate f base (cdr p)))))
```

Gold star bonus: Is there any procedure that can be defined using list-cruncher that cannot be defined using list-accumulate?