C.4.4 mapcar 函数

mapcar 会依次将第二个参数(序列)中的每个元素作为参数,传给第一个参数(函数)执行。

名称中的“map”来自数学术语 “在定义域上映射”,意思是对一个集合里的每个元素都应用一次函数。这个数学说法源自测绘人员一步步丈量并绘制地图的比喻。而“car”自然来自 Lisp 里表示列表首元素的概念。

例如:

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

函数 1+ 会对列表中的**每一个**元素执行加一操作,并返回一个新列表。

可以和 apply 对比,后者是把第一个参数一次性应用到所有剩余参数上。 (apply 的说明参见 See Readying a Graph。)

one-fiftieth 的定义中,第一个参数是匿名函数:

(lambda (arg) (/ arg 50))

第二个参数是 full-range,它会被绑定到 list-for-graph

完整表达式如下

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

关于 mapcar 的更多内容,See Mapping Functions in The GNU Emacs Lisp Reference Manual

使用 one-fiftieth 函数,我们可以生成一个新列表,其中每个元素都是 list-for-graph 中对应元素的五十分之一。

(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 个——但并不代表完全没有。)