wide
发表于 3 天前
apply,mapcar 组合总有个cons,这个cons的作用是什么?
wide
发表于 3 天前
llsheng_73 发表于 2015-9-2 17:03
把楼主的改了一下
这个更看不懂了。
llsheng_73
发表于 3 天前
CLOCK 发表于 2015-5-2 15:05
有木有把lambda apply mapcar 各种用法的帖子啊,记得以前哪看到过的(估计有2年左右了),由浅入深的都有 ...
(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 ...)差不多
wide
发表于 前天 20:39
llsheng_73 发表于 2024-12-24 21:36
(mapcar '+'(10 20 30) '(1 2 3))和(apply'mapcar(cons'+'((10 20 30)(1 2 3))))是一样的
但实际使用 ...
谢谢大佬讲评。
fengwenchao
发表于 昨天 23:07
感谢楼主解答