mapcar
Functionmapcar
是一个函数,它依次调用它的第一个参数,并将第二个参数的每个元素传递给它的第一个参数。第二个参数必须是一个序列。
名称中的‘map’部分来自数学短语,“在一个域上进行映射”,意味着对域中的每个元素应用一个函数。这个数学短语基于一个测量员逐步走过他正在绘制地图的区域的隐喻。而‘car’当然来自Lisp中列表的第一个元素的概念。
例如,
(mapcar '1+ '(2 4 6)) ⇒ (3 5 7)
函数1+
,它将其参数加一,被执行在列表的每个元素上,并返回一个新的列表。
与之相对的是apply
,它将其第一个参数应用于其余的所有参数。
(See 准备图表, 有关apply
的解释。)
在one-fiftieth
的定义中,第一个参数是匿名函数:
(lambda (arg) (/ arg 50))
而第二个参数是full-range
,它将绑定到list-for-graph
。
整个表达式看起来像这样:
(mapcar (lambda (arg) (/ arg 50)) full-range))
See Mapping Functions in The GNU Emacs Lisp Reference Manual, 有关mapcar
的更多信息。
使用one-fiftieth
函数,我们可以生成一个列表,其中每个元素都是list-for-graph
中相应元素的1/50大小。
(setq fiftieth-list-for-graph (one-fiftieth list-for-graph))
生成的列表如下:
(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)
这样,我们几乎可以打印出来了!(我们还注意到信息的丢失:许多较高的范围为0,意味着少于50个defuns有那么多单词或符号,但不一定意味着没有那么多单词或符号。)