首页 > 代码库 > map的使用

map的使用

map是一个非常好用的功能,先举个简单的例子

两个list元素的操作

(map + ‘(1 2 3) ‘(50 60 70))  → (51 62 73)

两个list元素的if操作

(map if ‘(true nil true nil true) ‘(1 2 3 4 5) ‘(6 7 8 9 10))
→ ‘(1 7 3 9 5)

这个有点意思,相当与用一堆bool值来确定是从第一个list中挑选元素,还是从第二个list中挑选。然后组成新的list.

将lambda表达式用于两个list

(map (fn (x y) (* x y)) ‘(3 4) ‘(20 10))
→ (60 40)

提取二维表中的某个列所有的数据

这个语法非常实用,现在就展现社区里面rickybody的一段代码:

(new Class ‘Node)

(set ‘l (list (Node "A" ‘happy)
	      (Node "B" ‘sad)
	      (Node "C" ‘happy)
	      (Node "D" ‘indifferent)
	      (Node "E" ‘surly)
	      (Node "F" ‘happy)
	      (Node "G" ‘sad)))



(println (map (fn (n) (n 0)) l))



输出结果是:

(Node Node Node Node Node Node Node)

如果(n 0)改成(n 1),结果为:

("A" "B" "C" "D" "E" "F" "G")

解释:

这里创建了一个Node类,用了newlisp的FOOP模式。然后将多个Node对象放在一个list中,如FOOP,每个对象都是一个list,第一个元素是类型,第二个元素是对象名称,第三个元素是一个属性. 看上去就是一个二维表,有三列,有七行。

这个自定义函数(fn (n) (n 0)) 就是提取对象list中的第0个元素,当然也可以提取第1个,第2个。

结果变成了一个list。





map的使用