找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1258|回复: 3

[密技]:一个把全局变量变为局部变量的小技巧

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2007-7-1 14:23:41 | 显示全部楼层 |阅读模式

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

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

×
很多情况下一些局部变量会从一个函数调到另外一个函数 ,而且很可能有很多这样的局部变量,这是候在参数设置后加局部变量,显得很长,很不美观,而且也容易忘记把它设置为局部变量。
这是候有一种小技巧:
就是把这些局部变量设置成为全局变量。然后通过对这些局部变量全部清空的函数来达到使得全局变量变成局部变量。

  1. (defun all-nil (/ SYMLIST)
  2.   (setq SYMLIST '(x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 ..........))
  3.   (foreach n SYMLIST
  4.     (set n nil)
  5.   )
  6.   ;;(mapcar 'set SYMLIST (mapcar '(lambda (x) nil) SYMLIST));一样的效果
  7. )

例如一个函数

  1. (defun test (x / )
  2.    ......

  3.    (all-nil)    ;虽然没有申明x1,x2.....是局部变量,但已全部清空了。
  4. )

这跟函数

  1. (defun  test (x / x1 x2 x3 .......)
  2. ......
  3. )

是一样的效果.
大家可以看看这个清空函数中set 的用法,更能体会到set, setq的区别。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-7-1 14:35:27 | 显示全部楼层
那不是每写一个程序都去重新读一遍程序,把要改变的全局变量一个个挑出来,放到(ALL-NIL)这个函数中来?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2007-7-1 16:23:44 | 显示全部楼层
这样没起到隔离变量空间作用域的效果,
是这一很不安全的结合方法。。。
对于一些程序可能会产生可能难以觉察的错误,
现在各种流行的编程方法是就是“封装”
它要求各模块间变量具有独立的变量空间,
非特别指定的变量在外部是无法访问与修改,
这才是一个相对安全的模式,这点CAD做的还不够好~
一个好的程序要尽可能的不用全局变量
(这不只是清空变量值这么简单,就算清空了它还是全局变量)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 16:30 , Processed in 0.241613 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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