明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3189|回复: 16

[提问] 写了个变量表进行清空的函数,但始终有个变量无法清空?!

[复制链接]
发表于 2014-8-2 18:47:29 | 显示全部楼层 |阅读模式
本帖最后由 wowan1314 于 2014-8-2 18:49 编辑

情况 如题!


T11是变量表清空函数!
  1. (defun t11 (lst) (mapcar ''((x)(set x nil)) lst))
下面是测试程序!
  1. (defun c:t12 ()
  2.     (defun t11 (lst) (mapcar ''((x)(set x nil)) lst))
  3.     (setq a1 1 b2 2 c3 3 lst '(a1 b2 c3))
  4.     (t11 lst)
  5.     (princ a1)
  6.     (princ b1)
  7.     (princ c1)
  8.     (princ lst)
  9.     (princ)
  10. )
问题:
1、其中lst无法清空,估计是因为要清空的变量与T11函数里的重复了,所以无法清空。  为什么呢?
2、在不改变lst这个名称的情况下,只修改T11如何能达到我要的效果??
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-8-2 20:17:35 | 显示全部楼层
  1. (defun c:t12 ()
  2.     (defun t11 (lst) (mapcar ''((x)(set x nil)) lst))
  3.     (setq a1 1 b2 2 c3 3 lst '(a1 b2 c3))
  4.     (t11 lst)
  5.     (setq tl1 nil)
  6.     (princ a1)
  7.     (princ b1)
  8.     (princ c1)
  9.     (princ lst)
  10.     (princ)
  11. )

点评

t11函数,还要继续用,不可清空。  发表于 2014-8-2 21:06
发表于 2014-8-2 20:21:32 | 显示全部楼层
这个行么?
(defun t11 (lst1) (mapcar ''((x) (set x nil))(cons (read "lst") lst1)))

点评

别改t11里面的lst. 你如果改它就把变量表一起改了!  发表于 2014-8-2 21:07
 楼主| 发表于 2014-8-2 21:15:00 | 显示全部楼层
看来还是把t11函数里面的lst改个不会用到的变量名吧!
发表于 2014-8-2 21:29:42 | 显示全部楼层
  1. _$ (defun c:t12 ()
  2.     (defun t11 (lst1) (mapcar ''((x)(set x nil)) lst1))
  3.     (setq a1 1 b2 2 c3 3 lst '(a1 b2 c3 lst))
  4.     (t11 lst)
  5.     (princ a1)
  6.     (princ b1)
  7.     (princ c1)
  8.     (princ lst)
  9.     (princ lst1)
  10.     (princ)
  11. )
  12. C:T12
  13. _$ (c:t12)
  14. nilnilnilnilnil
  15. _$

点评

要改就都改为lst1,我就怕我要清空的变量表有与t11里面的相同!  发表于 2014-8-2 21:35
发表于 2014-8-2 21:45:11 | 显示全部楼层
这个好像不行,同名无法清空,清空只能在T12中清空lst。
发表于 2014-8-2 22:11:26 | 显示全部楼层
个人理解,函数参数名和变量重复的时候,使得该变量成了内部全局变量,而用T11函数的lst是局部变量,能清空,但是不能影响全局变量的lst。因此,解决的方式是在T12中清空lst。
局部变量,全局变量,内部全局变量,这是个值得研究的问题,虽然我有时用这种方式,但是没有深究。
===
忽然想到一点,如果你打开了一个文件,然后执行删除操作,windows会提示你文件在使用,而无法删除。
发表于 2014-8-2 22:22:56 | 显示全部楼层
  1. (defun c:t12 ()
  2.     (defun t11 ()
  3.       (mapcar ''((x)(set x nil)) lst)
  4.       (setq lst nil)
  5.     )
  6.     (setq a1 1 b2 2 c3 3 lst '(a1 b2 c3))
  7.     (t11)
  8.     (princ a1)
  9.     (princ b1)
  10.     (princ c3)
  11.     (princ lst)
  12.     (princ)
  13. )

评分

参与人数 1明经币 +1 收起 理由
edata + 1 赞一个!

查看全部评分

 楼主| 发表于 2014-8-2 22:55:25 | 显示全部楼层
本帖最后由 wowan1314 于 2014-8-2 23:05 编辑

这个形象!文件使用中,无法清空!
其实你看t11的运行情况!它清空lst了!
只不过清空的是t11里面的lst,而没有清空t12里面的
变量名相同情况下!函数优先提拔自己人!
 楼主| 发表于 2014-8-2 23:00:50 | 显示全部楼层
nzl1116 发表于 2014-8-2 22:22

兄弟这样处理,其本质是不让同名!

看来同名情况下是无法处理了!

目前我把t11里面的lst改为 *琴瑟琵琶*

一般情况应该不会同名了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-25 00:11 , Processed in 0.207081 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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