我爱你王子呀 发表于 2015-9-12 09:57:18

(apply 'mapcar '(list (10 20) (30 40) (50 60)))表达式详解

各位大神早上好,小弟是才接触lisp的菜鸟。最近看了一个表达式(apply 'mapcar '(list (10 20) (30 40) (50 60))) 运行结果是((10 30 50) (20 40 60)) 小弟想了1天1夜 都想不出为何是这个结果 实在不得以,发帖向各位大神求助,还望各位大神不吝赐教,能详细解答下此表达式的运算过程。在此拜谢了,祝大家周末愉快
小弟只有一个明经币,拿出来悬赏,还望各位大神不要嘲笑小弟寒酸。

fl202 发表于 2015-9-12 10:09:19

等同于 (mapcar 'list '(10 20) '(30 40) '(50 60))
;返回:((10 30 50) (20 40 60))

(apply function list)
;传送一个参数表给一个指定的函数。
;apply将表中元素作为函数的参数,返回函数的值,返回值不一定是表
(apply '- (list 53 2));返回:0

(mapcar function list1 ... listn)
;对多个表中每个元素单独用函数进行处理,返回值是表
(mapcar 'list '(1 2 3 4 5)); 返回:((1) (2) (3) (4) (5))   

命令: (apply 'mapcar (cons 'strcat '(("1" "a" "2" ) ("b" "3" "c"))))
("1b" "a3" "2c")

我爱你王子呀 发表于 2015-9-12 10:50:37

fl202 发表于 2015-9-12 10:09 static/image/common/back.gif
等同于 (mapcar 'list '(10 20) '(30 40) '(50 60))
;返回:((10 30 50) (20 40 60))



谢谢fl202的解答!对于一个新人,能这样不厌其烦的解答,小弟不胜感激!大神解答的很详细,我想我已经理解了90%,唯一的疑问就是:(apply 'mapcar '(list (10 20) (30 40) (50 60))) 为什么 等同于(mapcar 'list '(10 20) '(30 40) '(50 60))?您看我这样理解对吗?(apply 'mapcar '(list (10 20) (30 40) (50 60))) 这个表达式实际上是:函数apply将表(list (10 20) (30 40) (50 60))给函数mapcar进行计算,然后就等同于 (mapcar 'list '(10 20) '(30 40) '(50 60)) 您看我这样理解对吗?还望您不吝指正

伪书虫86 发表于 2015-9-12 15:32:40

我爱你王子呀 发表于 2015-9-12 10:50 static/image/common/back.gif
谢谢fl202的解答!对于一个新人,能这样不厌其烦的解答,小弟不胜感激!大神解答的很详细,我想我已经理解 ...

对头
我是小尾巴~~~

xyp1964 发表于 2015-9-13 11:36:11

最简单的方式: (mapcar 'list '(10 20) '(30 40) '(50 60))
最容易理解的方式: (mapcar '(lambda (x y z) (listx y z)) '(10 20) '(30 40) '(50 60))

我爱你王子呀 发表于 2015-9-14 10:24:26

伪书虫86 发表于 2015-9-12 15:32 static/image/common/back.gif
对头
我是小尾巴~~~

谢谢书虫,只可惜我只有1个明经币

我爱你王子呀 发表于 2015-9-14 10:25:06

xyp1964 发表于 2015-9-13 11:36 static/image/common/back.gif
最简单的方式: (mapcar 'list '(10 20) '(30 40) '(50 60))
最容易理解的方式: (mapcar '(lambda (x y z)...

谢谢xyp,你的讲解清晰,容易,只可惜小弟寒酸,只有1个币

springwillow 发表于 2015-9-14 10:30:08

这个不就是矩阵的转置算法吗?

我爱你王子呀 发表于 2015-9-14 10:42:53

springwillow 发表于 2015-9-14 10:30 static/image/common/back.gif
这个不就是矩阵的转置算法吗?

小弟初学。。。。很多多不懂,还望大神不要笑话

ll_j 发表于 2015-9-14 12:32:08

我爱你王子呀 发表于 2015-9-12 10:50 static/image/common/back.gif
谢谢fl202的解答!对于一个新人,能这样不厌其烦的解答,小弟不胜感激!大神解答的很详细,我想我已经理解 ...

理解基本是正确的,但实际说等同,其实也并不完全等同,这句代码的精髓其实是apply的使用:数学运算函数的数量界限
在Lisp中对表中数据进行求和、求最大值等数学运算时,往往直观的对表直接赋予运算函数,使用语句如“(eval (cons 'MAX numlist))”,一般都可以进行计算,但当表中数据数量大于255时,将会出现错误“bad argument value: does not fit in byte: 256”。
对于这种情况,我们不必对数据表进行分段,可以直接使用函数apply,语法更简单:(apply 'MAX numlist)。apply可将数据表传送给指定的函数进行求值而不受数据数量的影响。
受表中数据数量影响的数学运算函数有:+、-、*、/、max、min、logand及logior等。这是我早期的一篇帖子中的一段。你所例代码使用apply正是考虑后面的表的长度可能是不定的,否则就直接使用mapcar了。
页: [1] 2
查看完整版本: (apply 'mapcar '(list (10 20) (30 40) (50 60)))表达式详解