找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 927|回复: 7

[求助] [求助]:请问嵌套函数有什么优点?

[复制链接]
发表于 2003-3-8 16:51:53 | 显示全部楼层 |阅读模式

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

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

×

  1. (defun c:adc()
  2.   (defun ab()
  3.    ......
  4. )
  5. (defun cd()
  6.   ......
  7. )
  8. .....
  9. )

请问这样嵌套写函数,在减少和别的程序冲突的情况下,还有什么优点,在内存运用方面和不嵌套是一样的吗?还是会减少内存的使用量。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-3-8 18:57:09 | 显示全部楼层
嵌套定义是可以将嵌套的内部函数按照局部变量一样声明,这样在程序运行结束后也会自行退出,自然会减少内存占用。在高版本的ACAD上,系统会自动分配内存,最主要的还是减少冲突。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-9 10:20:16 | 显示全部楼层
我在看AUTOCAD自带的一些lisp中很少有嵌套的使用,(autocad 2000) ,可能正如您所说autocad能够自动分配内存,所以不用嵌套时,内存的占用量和使用嵌套时应该是一样的。
我这样理解正确吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-3-9 15:01:25 | 显示全部楼层
Acad自带的Lisp程序一般在较大时采用嵌套定义,一般来说,acad自带程序按照一定规则书写并经过专人测试,函数冲突极少发生,而对我们一般的编程者(使用者)而言,既没有规则,也没有广泛测试,只是满足使用而已,所以冲突是难免的。只是有些冲突会引起致命错误,我曾经有两个程序,当同时加载时,有一个函数重复定义,使用时没有任何提示就跳出Acad,这种情况就比较可怕了。现在,我定义函数全部都用“程序名_函数名”格式,冲突大大减少。
R14的ddmodify.lsp、ddchprop.lsp中使用“程序名_init”嵌套定义,bmake.lsp等使用“(defun c:xx(/..) (defun fun()...)”格式嵌套定义,R2002的filter.lsp等也包含嵌套定义,你可以看看。
关于内存,我的理解并不是采用嵌套定义与否占用内存一样,其实也并不一样,而是这一点内存开销对acad来说只是“九牛一毛”,实在当管理Lisp模块的内存紧张时,Acad会自动分配内存。不过不管怎么说,浪费内存毕竟不是好习惯。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-9 19:48:45 | 显示全部楼层
多谢您的指点,我一直没有嵌套写函数的习惯,以前也曾有过函数冲突。在看了ACAD自带的lisp教程后,也采用程序名:函数名来定义函数。因为我知道局部变量是在程序完成后自动释放内存的,所以我就想知道嵌套函数是否和局部变量一样了。
再次感谢您的耐心解答。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-3-11 08:21:28 | 显示全部楼层
Acad中变量与函数所不同主要是变量返回数值,函数返回过程,所以定义方法不同。但函数释放的方法与变量是相同的,可以用(setq xx nil),也可以当作局部变量声明(嵌套定义)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-3-26 11:14:34 | 显示全部楼层
其实在主函数的局部变量声明中也要把内部函数名加上去,退出后才能释放它,不然它才不管你是在哪儿定义它的,它都是全局函数。
如:
(defun c:test( / abc def)
   .....
   (defun abc()
       ....
   )
   (defun def()
    .....
   )
    .....

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 09:49 , Processed in 0.175838 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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