Next: Another Bug, Previous: lambda, Up: Print Whole Graph [Contents][Index]

`mapcar`

Function`mapcar`

is a function that calls its first argument with each
element of its second argument, in turn. The second argument must be
a sequence.

The ‘`map`’ part of the name comes from the mathematical phrase,
“mapping over a domain”, meaning to apply a function to each of the
elements in a domain. The mathematical phrase is based on the
metaphor of a surveyor walking, one step at a time, over an area he is
mapping. And ‘`car`’, of course, comes from the Lisp notion of the
first of a list.

For example,

(mapcar '1+ '(2 4 6)) ⇒ (3 5 7)

The function `1+`

which adds one to its argument, is executed on
*each* element of the list, and a new list is returned.

Contrast this with `apply`

, which applies its first argument to
all the remaining.
(See Readying a Graph, for an explanation of
`apply`

.)

In the definition of `one-fiftieth`

, the first argument is the
anonymous function:

(lambda (arg) (/ arg 50))

and the second argument is `full-range`

, which will be bound to
`list-for-graph`

.

The whole expression looks like this:

(mapcar (lambda (arg) (/ arg 50)) full-range))

See Mapping Functions in The GNU Emacs
Lisp Reference Manual, for more about `mapcar`

.

Using the `one-fiftieth`

function, we can generate a list in
which each element is one-fiftieth the size of the corresponding
element in `list-for-graph`

.

(setq fiftieth-list-for-graph (one-fiftieth list-for-graph))

The resulting list looks like this:

(10 20 19 15 11 9 6 5 4 3 3 2 2 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 4)

This, we are almost ready to print! (We also notice the loss of information: many of the higher ranges are 0, meaning that fewer than 50 defuns had that many words or symbols—but not necessarily meaning that none had that many words or symbols.)

Next: Another Bug, Previous: lambda, Up: Print Whole Graph [Contents][Index]