找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1217|回复: 6

[分享]:APPLY函数的妙用

[复制链接]

已领礼包: 444个

财富等级: 日进斗金

发表于 2002-3-9 11:34:51 | 显示全部楼层 |阅读模式

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

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

×
本文的写成得到管理员XD大力帮助,是他让我认识到APPLY函数的妙处。[/COLOR]
我们先来看一下AutoCAD2000中文版中对APPLY函数的描述吧。
将参数表传给指定的函数
(apply 'function list)
参数
'function
函数,可以是表示 defun 或 lambda 表达式的符号。
list
表。如果函数不接收参数,则该参数为 nil。
返回值
函数调用的结果。
样例
命令:(apply '+ '(1 2 3))
6
命令:(apply 'strcat '("a" "b" "c"))
"abc"
这只是APPLY函数应用的基础。
如果深入理解深刻LISP的精华就是表(LIST)的话,就可以对此深入探讨一下。
如果我们要画出P1、P2、P3……PN的连线。该如何用LISP编程呢?
按照我原先的想法就是调用一个NTH函数求出表长,然后在一循环中不断调用(Command "._LINE" P1 P2 "")。
因为我们这样对表在(Command "._LINE" ……)中的传递是多么的惘然。
这真是浪费的表的易操作性。
让我们借用APPLY来操作一下吧。
假定:
(SetQ PList (P1 P2 P3 P4 P5))是一个点对。
(Apply 'Command (cons "line" plist))
这样就可以达到目的啦。不过最后还加上 (Command "")这个回车才好用。
让我们再讲这个(Command "")加入到表中。
(setq a (cons "line" p1 p2 ..pn));点对表。
(setq B (reverse (cons "" (reverse a))));两次转置得到尾部另加上""
(Apply 'Command (cons "line" B))
这样的操作一次就OK!
如果改为PLINE不就是画出多段线吗?
(Apply 'Command (cons "line" B))真是一次OK啦。
当然,如果你要在多段线中修改线宽。就需要再次对你的点对表进行修改啦。
再比如画轴网( (p1 p2) (p1 p2)...(p1 p2))代表所有算出来的起点和终点组然后你就可以(foreach n plist (apply 'command (Cons "line" n)(command ""))。
1[/COLOR]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-10-19 22:47:47 | 显示全部楼层
最近这样的贴少了.

apply对不定参数的函数特有用,咱们来看看:
------------------------------------------------------------
命令: (defun gg(a b)(+ a b 3 9(/ a 4.)))
GG

命令: (apply 'gg '(4 5))
22.0

命令: (apply 'gg '(4 5 7))

错误: 参数太多


;;;相当于 (gg 4 5)-->22.0   (gg 4 5 7)-->错
--------------------------------------------------------------------------
再看:
命令: (setq a '(1 2 3 4 5))
(1 2 3 4 5)

命令: (+ 1 2 3 4 5)
15

命令: (apply '+ a)
15

命令: (setq b(cons '+ a))
(+ 1 2 3 4 5)

命令: (eval b)
15



;;;apply起到的作用:就是把函数放到表头,然后求值。就这么简单.


--------------------------------------------------------------------------
如果没apply,要自己定义:
(defun my-apply(foo li)(eval(cons foo li)))

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

使用道具 举报

发表于 2003-10-21 02:43:38 | 显示全部楼层
玩玩:)

(defun cc() (setq a 1 b 2)(+ a b))   返回:2
(setq a 1 b 2 cc (eval (cons '+ '(a b)))) 返回:2
(eval (cons '+ '(1 2))) 返回:2

(setq cc (cons '+ '(1 2)))
(eval cc) 返回:2
;;
(defun cc (x y) (+ x y))
(cc 1 2)  返回:2

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2003-10-23 14:26:22 | 显示全部楼层
俺目前正开始学习autolisp编程

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 21:02 , Processed in 0.176010 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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