明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4595|回复: 16

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

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

发表于 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 5  3 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
等同于 (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)) 您看我这样理解对吗?还望您不吝指正
回复

使用道具 举报

发表于 2015-9-12 15:32:40 | 显示全部楼层
我爱你王子呀 发表于 2015-9-12 10:50
谢谢fl202的解答!对于一个新人,能这样不厌其烦的解答,小弟不胜感激!大神解答的很详细,我想我已经理解 ...

对头
我是小尾巴~~~
回复

使用道具 举报

发表于 2015-9-13 11:36:11 | 显示全部楼层
最简单的方式: (mapcar 'list '(10 20) '(30 40) '(50 60))
最容易理解的方式: (mapcar '(lambda (x y z) (list  x y z)) '(10 20) '(30 40) '(50 60))
回复

使用道具 举报

 楼主| 发表于 2015-9-14 10:24:26 | 显示全部楼层
伪书虫86 发表于 2015-9-12 15:32
对头
我是小尾巴~~~

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

使用道具 举报

 楼主| 发表于 2015-9-14 10:25:06 | 显示全部楼层
xyp1964 发表于 2015-9-13 11:36
最简单的方式: (mapcar 'list '(10 20) '(30 40) '(50 60))
最容易理解的方式: (mapcar '(lambda (x y z)  ...

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

使用道具 举报

发表于 2015-9-14 10:30:08 | 显示全部楼层
这个不就是矩阵的转置算法吗?
回复

使用道具 举报

 楼主| 发表于 2015-9-14 10:42:53 | 显示全部楼层
springwillow 发表于 2015-9-14 10:30
这个不就是矩阵的转置算法吗?

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

使用道具 举报

发表于 2015-9-14 12:32:08 | 显示全部楼层
我爱你王子呀 发表于 2015-9-12 10:50
谢谢fl202的解答!对于一个新人,能这样不厌其烦的解答,小弟不胜感激!大神解答的很详细,我想我已经理解 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 15:07 , Processed in 0.166469 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表