Higher-Order Procedures
Summary:
In this laboratory, you will use and define higher-order
procedures.
Preparation
a. Make a copy of the code for this lab.
b. In the interactions pane, create a new 200x200 image and make a note of the
image number.
> (image-show (image-new 200 200))
c. In the definitions pane, write an instruction to associate the name
canvas with that image number. For example, if the image
is number 1, you would write
(define canvas 1)
Exercises
Exercise 1: Using map
Recall that (map proc
lst) builds a new list by applying
proc to each element of lst
in succession.
Recall also that (iota n)
builds a list of integers from 0 to n-1.
a. (iota 10) computes a list of the integers between
0 and 9. Use map and iota to
compute the list of integers between 1 and 10.
b. Use map to compute the successors to the squares of
the integers between 1 and 10. (That is, for each value in the list,
square it and then add 1.) Your result should be
the list (2 5 10 17 26 37 50 65 82 101).
c. Use map to take the last element of each list in a
list of lists. The result should be a list of the last elements.
For example,
> (map _____ (list (list 1 2 3) (list 4 5 6) (list 7 8 9 10) (list 11 12)))
(3 6 10 12)
d. Use
apply and map to sum the
last elements of each list in a list of lists of numbers. The result
should be a number.
> (apply _____ (map _____ (list (list 1 2 3) (list 4 5 6) (list 7 8 9 10) (list 11 12))))
31 ; 3 + 6 + 10 + 12
Hint: You already know how to get a list of the
last elements of each member list, so think about how to add them.
Reminder:
As you may recall,
(apply proc
lst) is another way to write
(proc v1
v2 ... vn)
given that lst
is (v1 v2
... vn).
Exercise 2: Transforming Colors
a. Read through the code for image-render-colors! and
be prepared to explain, in your own words, what this procedure does.
b. What effect do you expect the following instruction to have?
> (image-render-colors! canvas colors-rainbow)
c. What effect do you expect the following instruction to have?
> (image-render-colors! canvas (map rgb-complement colors-rainbow))
d. Check your answer experimentally.
e. Write an expression to render a darker version of the rainbow on
canvas.
f. Write an expression to generate a list of colors that are a much
darker version of colors-rainbow. (For each color,
call rgb-darker three times.)
g. Here are four possible solutions to the previous problem. Which do
you prefer? Why? Be prepared to discuss your reasons with the class.
> (map rgb-darker (map rgb-darker (map rgb-darker colors-rainbow)))
> (map (lambda (c) (rgb-darker (rgb-darker (rgb-darker c)))) colors-rainbow)
> (map (compose rgb-darker (compose rgb-darker rgb-darker)) colors-rainbow)
> (map (o rgb-darker rgb-darker rgb-darker) colors-rainbow)
Exercise 3: Sectioning
As you may recall, the left-section (a.k.a.
l-s) and right-section
(a.k.a. r-s) procedures let you create a new
procedure by filling in one of the two parameters of a two-parameter
procedure.
a. Review the definitions of these procedures
b. Using left-section or l-s,
define a procedure, (increment-nums
lst), that takes a list of numbers and
adds 1 to each number. Your definition is likely to also involve
map.
c. Using left-section or l-s,
write an expression
that computes the reciprocals of the numbers between
1 and 10. (Recall that the reciprocal of x is
1/x.) Your expression is likely to also involve
map, and possibly other procedures.
d. What do you think will happen if use
right-section instead of
left-section in the previous two exercises?
e. Check your answer experimentally.
Exercise 4: Map with Multiple Lists
Although we often use the map procedure with only two
parameters (a procedure and a list), it can take more than two
parameters, as long as the first parameter is a procedure, the
remaining parameters are lists, and the procedure can legally take
the corresponding parameters from each list. For example, if the
procedure is +, each list must contain numbers.
a. What colors do you expect the following expression to produce?
> (map rgb-average colors-rainbow (make-list (length colors-rainbow) color-white))
b. Check your answer experimentally, by rendering the result on
canvas, by converting each color to a string, or both.
c. What do you expect the following expression to produce?
> (map rgb-average colors-rainbow (make-list 5 color-white))
d. Check your answer experimentally.
e. What do you expect the following expression to produce?
> (map rgb-average colors-rainbow (map rgb-complement colors-rainbow))
f. Check your answer experimentally.
Exercise 5: Map with Multiple Lists, Revisited
a. What do you think the value of the following expression will be?
> (map (lambda (x y) (+ x y)) (list 1 2 3) (list 4 5 6))
b. Check your answer through experimentation.
c. What do you think the value of the following expression will be?
> (map list (list 1 2 3) (list 4 5 6) (list 7 8 9))
d. Check your answer through experimentation.
e. What do you think Scheme will do when evaluating the following expression?
> (map (lambda (x y) (+ x y)) (list 1 2) (list 3 4) (list 5 6))
f. Check your answer through experimentation.
g. What do you think Scheme will do when evaluating the following expression?
> (map + (list 1 2 3) (list 4 5 6))
h. Check your answer through experimentation.
i. What do you think Scheme will do when evaluating the following expression?
> (map + (list 1 2) (list 3 4) (list 5 6))
j. Check your answer through experimentation.
k. What do you think Scheme will do when evaluating the following expression?
> (map + (list 1 2) (list 3 4) (list 5 6 7))
l. Check your answer through experimentation.
Exercise 6: Dot-Product
Use apply and map to
concisely define a procedure, (dot-product
list1 list2), that takes
as arguments two lists of numbers, equal in length, and returns the
sum of the products of corresponding elements of the arguments:
> (dot-product (list 1 2 4 8) (list 11 5 7 3))
73
> (dot-product null null)
0
Note that we get the first result because (1 x 11) + (2 x 5) + (4 x 7) +
(8 x 3) = 11 + 10 + 28 + 24 = 73 and the second because there are no
products to add.
Exercise 7: Acronyms
The procedure (acronym
strings) produces an acronym from a list
of strings. For example,
> (acronym (list "GNU" "Image" "Manipulation" "Program"))
"GIMP"
> (acronym (list "International" "Business" "Machinery"))
"IBM"
Write acronym as concisely as possible.
As a hint, you will want to use
string-ref,
list->string,
map,
and either l-s or r-s.
(Recall that (string-ref
string i)
produces the ith character in
string.
list->string takes a list of characters and turns
it into a string.)