map是一个非常好用的功能,先举个简单的例子
(map + ‘(1 2 3) ‘(50 60 70)) → (51 62 73)
(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.
(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)
("A" "B" "C" "D" "E" "F" "G")
这里创建了一个Node类,用了newlisp的FOOP模式。然后将多个Node对象放在一个list中,如FOOP,每个对象都是一个list,第一个元素是类型,第二个元素是对象名称,第三个元素是一个属性. 看上去就是一个二维表,有三列,有七行。
这个自定义函数(fn (n) (n 0)) 就是提取对象list中的第0个元素,当然也可以提取第1个,第2个。
结果变成了一个list。
原文地址:http://blog.csdn.net/csfreebird/article/details/41853869