- 积分
- 60917
- 明经币
- 个
- 注册时间
- 2005-11-29
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
(mapcar '+ '(10 20 30) '(1 2 3))和(apply'mapcar(cons'+'((10 20 30)(1 2 3))))是一样的
但实际使用起来,适用情况是完全不同的,假如程序运行过程中,得到了有限的几个坐标点,比如正方形或矩形的4个角点坐标,分别用p1,p2,p3,p4存储,现在计算这4个点的坐标和,显然用第一个就行了,但是,如果这4个点在一个坐标点表里边,甚至个数不确定呢?比如pts((0 0 0)(0 5 0)(5 5 0)(5 0 0)),这时apply'mapcar就很必要了,由于pts是一个表,各项分别为一个坐标点,那么+这个操作符需要通过cons给搞到前边,再对它使用apply'mapcar...感觉这样还是不好理解apply'mapcar,得先理解apply,比如(max 1 2 3)和(apply'max '(1 2 3))这里应该有启发了,不过还是需要多想多测试
至于lambda,可以理解为临时定义一个无名函数,因为别的地方不需要它,所以它不需要有名字,什么地方定义它什么地方才能用它,用完就完。经常看到它出现在mapcar,vl-sort等函数内,因为mapcar,vl-sort等函数要进行的处理通常较为复杂,至少无法直接调用系统函数,所以在里边定义一个临时函数显然比较合理,和普通函数一样,它可以有参数,也可以定义局部变量,实际上它可以出现在任何地方而不是某个函数内部,当它单独出现的时候,外边一般需要加一层括号来调用它,否则只定义了它,但又没函数名,其它地方无法调用它,最终定义一个寂寞?
(mapcar '(lambda (x) (+ x 3) ) '(10 20 30) ) =>(13 23 33)里边的(lambda (x) (+ x 3) )就是一个临时函数,它只能通过mapCar反复调用它
((lambda(/ a) 这里可以写需要的一切))就是可以在任何地方出现并且能自动运行,这样它除了能定义局部变量外,实际上和(progn ...)差不多 |
|