找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5448|回复: 24

[求助] apply、function、lambda、mapcar函数学习

[复制链接]
发表于 2013-5-27 22:12:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
apply、function、lambda、mapcar函数搞得头大了,俺收集了一小点

盼望高手们能添加一些以便学习

================================= apply 将参数表传给指定的函数==============================
(apply 'function list)
参数   'function 函数,可以是表示 defun 或 lambda 表达式的符号。
list   表。如果函数不接收参数,则该参数为 nil
返回值 函数调用的结果。
-------------------------------------
示例1
(apply '+ '(1 2 3))
返回:-> 6
-------------------------------------
示例2
(setq lst '((("GC200" . 2)) nil))
(apply '+ (mapcar 'cdr (car lst)))
返回:-> 2
-------------------------------------
示例3
(apply 'strcat '("a" "b" "c"))
返回:->  "abc"
------------------------------------------------------------
示例4
(apply 'append (reverse '((4 5 6) (1 2 3))))
返回:-> (1 2 3 4 5 6)
------------------------------------------------------------
示例5
(setq a '(1 2 3 4 5 6 7 8 9 0))
(apply 'mapcar (cons 'list (list a (cdr a))))
返回:-> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8) (8 9) (9 0))
------------------------------------------------------------
示例6
(setq b '((0 1 2) (3 4 5) (6 7 8)))
(apply 'mapcar (cons 'list b))
返回:-> ((0 3 6) (1 4 7) (2 5 8))
----------------------------------------
示例7
(setq lst '((3 4 5) (0 1 2) (6 7 8)))
(apply 'mapcar (cons 'min lst)) ;或 (apply 'mapcar (cons 'max lst))
返回:-> (0 1 2)
=============== function 通知 Visual LISP 编译器将参数作为内置函数进行链接和优 ===============
(function symbol | lambda-expr)
function 函数与 quote 函数相同,但它将通知 Visual LISP 编译器将参数视为内部函数或用 defun 定义的
          函数,对其进行链接和优化.由 function 引用的经过编译的 lambda 表达式加载到 Visual LISP IDE 时,
          将包含调试信息
参数      symbol 命名函数的符号
          lambda-expr 如下格式的表达式:(lambda arguments {S-expression}* )
返回值    表达式的求值结果。
------------------------------------------------------------------------
示例1
(mapcar (function (lambda (x) (* x x))) '(1 2 3))
返回:-> (1 4 9)
------------------------------------------------------------------------
示例2
(setq lst '((3.33 4.44) (1.11 2.22) (5.55 6.66)))
(vl-sort lst (function (lambda (a b) (< (car a) (car b)))))
返回:-> ((1.11 2.22) (3.33 4.44) (5.55 6.66))
=================================== lambda 定义无名函数====================================
(lambda arguments expr...)
在经常使用某一表达式,而又觉得把它定义成一个新函数开销太大时可使用 lambda 函数。
lambda  将定义的函数放在要使用它的位置,还可以使程序员的意图表达得更清楚。
lambda  函数返回它最后一个 expr 的值。它常与 apply 和(或)mapcar 函数连用,以便对表中的元素执行某个操作。
参数    arguments传给表达式的参数。
expr    AutoLISP 表达式。
返回值  最后一个 expr 的值。
-----------------------------------------------------------------
示例1
(apply '(lambda (x y z) (* x (- y z))) '(5 20 14))
返回:-> 30
-----------------------------------------------------------------
示例2
(setq a 0)
(mapcar '(lambda (x) (setq a (1+ a)) (* x 5)) '(2 4 -6 10.2))
返回:-> (10 20 -30 51.0)
-----------------------------------------------------------------
示例4
(setq m '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)))
(setq n '((0.5 0.0 0.0) (0.0 0.5 0.0) (0.0 0.0 0.5)))
((lambda (a) (mapcar '(lambda (r) (mxv a r)) m)) (trp n))
返回:-> ((0.25 0.0 0.0) (0.0 0.25 0.0) (0.0 0.0 0.25))
-----------------------------------------------------------------
示例5
(setq x "A" n 3 L '(0 1 2 3 4 5))
((lambda (i) (apply 'append (mapcar '(lambda (a) (if (= n (setq i (1+ i))) (list x a) (list a))) L))) -1)
返回:-> (0 1 2 "A" 3 4 5)
======================================== mapcar ==========================================
将作为本函数参数的一个或多个表的各个元素提供给指定函数进行求值,并将由求值结果构成的表返回
(mapcar function list1... listn)
参数   function
函数。 list1... listn 一个或多个表。表的数目必须与 function 参数中要求的参数个数相等。
返回值 表。
-----------------------------------------------------------------
示例1
(setq a 10 b 20 c 30)
(mapcar '1+ (list a b c))
返回:-> (11 21 31)
-----------------------------------------------------------------
示例2
(setq lst '((1.11 2.22) (3.33 4.44)))
(mapcar '(lambda (x) (cons 10 x)) lst)
返回:-> ((10 1.11 2.22) (10 3.33 4.44))
-----------------------------------------------------------------
示例3
(mapcar '(lambda (x) (+ x 3)) '(10 20 30))
返回:-> (13 23 33)
-----------------------------------------------------------------
示例4
(setq lst '((1.11 2.22) (3.33 4.44) (5.55 6.66)))
(mapcar '(lambda (x) (apply 'mapcar (cons x lst))) '(min max))
返回:-> ((1.11 2.22) (5.55 6.66))
-----------------------------------------------------------------
示例5
(setq ins '(710.623 295.614 88.313))
(setq ent (car (entsel))) ;<图元名: 7ef86d38>
(mapcar '+ (trans ins ent 1) '(1e-4 1e-4))
返回:-> (710.623 295.614)
-----------------------------------------------------------------
示例6
(setq m '((0.5 0.0 0.0) (0.0 0.5 0.0) (0.0 0.0 0.5)))
(setq v '(1.0 0.0 0.0))
(mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
返回:-> (0.0 0.5 0.0)
-----------------------------------------------------------------
示例7
(setq lst '((2.22 2.22) (1.11 1.11) (4.44 4.44) (5.55 6.66) (7.77 8.88)))
(setq ins '(3.33 3.33))
(mapcar '(lambda (n) (nth n lst)) (vl-sort-i ins '>))
返回:-> ((1.11 1.11) (2.22 2.22))
-----------------------------------------------------------------
示例8
(setq a '(100 100))
(setq b '(200 200))
(mapcar (function (lambda (a b) (/ (+ a b) 2.0))) a b)
返回:-> (150.0 150.0)

评分

参与人数 4D豆 +14 贡献 +1 收起 理由
Lispboy + 5 很给力!经验;技术要点;资料分享奖!
炫翔 + 5 很给力!经验;技术要点;资料分享奖!
XDSoft + 1
牢固 + 4 好主题奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-6-9 22:39:02 | 显示全部楼层
炫翔 发表于 2013-6-3 08:29
将表中的第一个与第二个元素 用CONS组成

示例5
(setq a '(1 2 3 4 5 6 7 8 9 0))
(apply 'mapcar (cons 'list (list a (cdr a))))
返回:-> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8) (8 9) (9 0))

这个详细过程是否可以这样理解:
_$ (setq a '(1 2 3 4 5 6 7 8 9 0))
_$ (list a (cdr a))
((1 2 3 4 5 6 7 8 9 0) (2 3 4 5 6 7 8 9 0))
_$ (cons 'list (list a (cdr a)))
(LIST (1 2 3 4 5 6 7 8 9 0) (2 3 4 5 6 7 8 9 0))
_$ (apply 'mapcar '(LIST (1 2 3 4 5 6 7 8 9 0) (2 3 4 5 6 7 8 9 0)))
((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8) (8 9) (9 0))

点评

好像弄复杂了哎 (mapcar 'list a (cdr a)) 不是和你一样的结果?  详情 回复 发表于 2013-6-9 22:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-27 22:15:21 | 显示全部楼层
总结的很好,很到位,希望朋友们补充。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-5-28 18:26:23 | 显示全部楼层
非常好,
示例不在于多,而在于经典!

点评

(setq a '(1 2 3 4 5 6 7 8 9 0)) (apply 'mapcar (cons 'list (list a (cdr a)))) 返回:-> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8) (8 9) (9 0))帮忙分析下  详情 回复 发表于 2013-6-2 19:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

发表于 2013-5-28 21:05:55 | 显示全部楼层
不错 不错 我也正在琢磨这几个函数,非常感谢楼主
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

发表于 2013-5-31 12:19:55 | 显示全部楼层
楼主师兄!今天看了你的收藏,自觉开了眼晴长了见识.只是有一个例子看不大懂.不知楼主师兄是否有空为小菜解答一下.例子如下:
(setq a '(1 2 3 4 5 6 7 8 9 0))
(apply 'mapcar (cons 'list (list a (cdr a))))
返回:-> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8) (8 9) (9 0))

点评

(setq lst '(1 2 3 4 5 6 7 8 9 0)) (setq cc (mapcar 'list lst (cdr lst))) 二个返回值是一个样的!  详情 回复 发表于 2013-5-31 12:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 449个

财富等级: 日进斗金

发表于 2013-5-31 12:35:03 | 显示全部楼层
xtdwynij 发表于 2013-5-31 12:19
楼主师兄!今天看了你的收藏,自觉开了眼晴长了见识.只是有一个例子看不大懂.不知楼主师兄是否有空为小菜解答 ...

(setq lst '(1 2 3 4 5 6 7 8 9 0))
(setq cc (mapcar 'list  lst (cdr lst))) 二个返回值是一个样的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 218个

财富等级: 日进斗金

发表于 2013-6-2 19:00:16 来自手机 | 显示全部楼层
炫翔 发表于 2013-5-28 18:26
非常好,
示例不在于多,而在于经典!

(setq a '(1 2 3 4 5 6 7 8 9 0))
(apply 'mapcar (cons 'list (list a (cdr a))))
返回:-> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8) (8 9) (9 0))帮忙分析下

点评

将表中的第一个与第二个元素 用CONS组成  详情 回复 发表于 2013-6-3 08:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-2 19:31:16 | 显示全部楼层
一个实例应用(50积分,10豆限制)
http://bbs.xdcad.net/thread-668580-1-1.html
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-6-3 08:29:46 | 显示全部楼层
fkyourmather 发表于 2013-6-2 19:00
(setq a '(1 2 3 4 5 6 7 8 9 0))
(apply 'mapcar (cons 'list (list a (cdr a))))
返回:-> ((1 2) (2  ...

将表中的第一个与第二个元素 用CONS组成

点评

示例5 (setq a '(1 2 3 4 5 6 7 8 9 0)) (apply 'mapcar (cons 'list (list a (cdr a)))) 返回:-> ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7 8) (8 9) (9 0)) 这个详细过程是否可以这样理解:  详情 回复 发表于 2013-6-9 22:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-6-9 22:53:21 | 显示全部楼层
laibinwu 发表于 2013-6-9 22:39
示例5
(setq a '(1 2 3 4 5 6 7 8 9 0))
(apply 'mapcar (cons 'list (list a (cdr a))))

好像弄复杂了哎

(mapcar 'list a (cdr a)) 不是和你一样的结果?

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 版本对mapcar理解极深

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-24 20:52:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 35个

财富等级: 招财进宝

发表于 2013-6-24 21:47:34 | 显示全部楼层
新手表示强烈关注
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-28 11:48:41 | 显示全部楼层
本帖最后由 crazylsp 于 2013-6-28 11:55 编辑

(setq lst '((3 4 5) (0 1 2) (6 7 8)))
(apply 'mapcar (cons 'min lst)) 如何理解?   (cons (mapcar 'min lst)lst)?

点评

运行完了看看返回值是什么  详情 回复 发表于 2013-6-28 11:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-6-28 11:59:38 | 显示全部楼层
crazylsp 发表于 2013-6-28 11:48
(setq lst '((3 4 5) (0 1 2) (6 7 8)))
(apply 'mapcar (cons 'min lst)) 如何理解?   (cons (mapcar 'mi ...

运行完了看看返回值是什么
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-24 19:57 , Processed in 0.275732 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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