Page 5: Transforming Every List Item
Unit 3, Lab 2, Page 5
On this page, you will use the map
block to create an initials from name
block and then use map
together with initials from name
to find the initials of all of your contacts.
Alphie, Betsy, and Gamal are building an initials from name
block that accepts one contact as input and reports that person’s initials.
Betsy: I used the block to break up the contact’s full name into a list of their names, and then I joined the first letter of each name:
What’s the difference between splitting by spaces and splitting by words?
Try it! (Each brown dot represents a space.)
In one case, split
is focusing on the exact characters in the string. In the other case, it’s giving you what you really want: the words in the contact’s name. At a low level of abstraction, text is made of characters and you look through each of the characters. But at a higher level of abstraction (such as when you are reading), text is made up of words. Snap! lets you think at this higher level of abstraction.
Alphie: But what about someone who goes by three names like Martin Luther King? It would just report “ML” for him.
Gamal: Oh, that’s because the block only takes the first letter of items 1 and 2. We have to add in letter (1) of (item (3) of (list of names))
.
Betsy: But what if someone has more names than that? In my aunt’s family they each have five or six names…
Gamal: Well, then we need to take letter (1) of
each item in the list of names. That sounds as if what we need is a higher-order function. Higher-order functions are good at doing things with individual items in a list.
A higher-order function is a function that takes a function as input (or reports a function as output).
-
Build and experiment with these examples of the
map
function.
- Discuss and then explain in writing what these expressions are doing.
The block takes two inputs: a function (a reporter with a blank input slot) and a list, and it reports a new list in which each item is the result of calling the function with an item from the original list as input. For example:
You choose the function that describes the result for one input item, and map
applies that function to each item in the input list and then reports the list of result values. If your function has item 1 of
or item 2 of
in it, you’re probably trying to do map
’s part of the job.
Map
is a higher-order function just like keep
and combine
. The function mapped over the list always has a blank input slot. This is where the list item goes each time the function is performed.
This picture shows how the three higher-order functions could be used:
See the higher-order function expressions with these (imaginary) shape procedures.
Here is a quick review of the higher-order functions map
, keep
, combine
.
-
Map
performs a function on every item of a list and reports the list of changed items.
-
Keep
uses a predicate function (a true/false question) to check every item in a list and reports the items that make the predicate true. (You learned aboutkeep
on Unit 2 Lab 3 Page 5:Keep
ing Items from a List.)
-
Combine
uses a combining function (a function with two inputs) to report the results of combining all the items in a list using that function. (You learned aboutcombine
on Unit 2 Lab 4 Page 3: More Mathematical Reporters.)
- If it isn’t open already, open your U3L2-ContactList project.
-
Use
map
andcombine
together to build aninitials from name
reporter that takes a name as input and reports that person’s initials.
-
Test and debug your
initials from name
block. -
Create an expression to report a list of the initials of all your contacts.
First, create an expression to report a list of the names of all your contacts.
→→
-
-
Click the picture to load this database project:
Data from Structure and Interpretation of Computer Programs by Abelson and Sussman. Creative Commons licensed.
This is the list of employees of a small company. Each of the smaller lists contains a person’s name, job title, and yearly salary.“This company spends more money on the big bosses than on the people who do the work,” says Alyssa one day. Is she right? Write an expression to compute the total salaries of everyone paid less than $100,000 per year. Then find the total for everyone paid more than $100,000 per year.
- Ben suggests that the results will be more convincing in the form of a list containing that total and all the names of the people in that category (paid less than $100,000, for example). So, if there are five people in that category, your list will have six items: first the total of the salaries, and then the names of the people. Try this both for less than $100,000 and for more than $100,000.
- Find the average salary of people paid less than $100,000 per year.