明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1596|回复: 9

[提问] 当输入N时,程序就结束了,不会再执行恢复系统变量设置

  [复制链接]
发表于 2014-7-26 15:00 | 显示全部楼层 |阅读模式
(initget "Y N") ;设置程序是否继续执行/结束
(setq key (getkword "\n是否截断,执行/结束[Y/N] (N)"))
(cond
  ((= key "Y")
(C:zxx) ;加载画折断线程序
)
;;恢复系统变量设置
(setvar "CMDECHO" old_CMD)
(setvar "OSMODE" old_OS)
(setvar "clayer" AA)
;执行完毕返回0层
(setvar "clayer" "0")
(princ)

这是一个程序的一段,这里有个问题,当输入N时,程序就结束了,好像不会再执行最后的
“”;;恢复系统变量设置  
(setvar "CMDECHO" old_CMD) (setvar "OSMODE" old_OS)
(setvar "clayer" AA)
;执行完毕返回0层
(setvar "clayer" "0") “”这几句了。

这个问题如何解决


点评

1、可能逻辑不对(括弧不对);2、用了exit函数  发表于 2014-7-26 19:42
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-7-26 15:38 | 显示全部楼层
(Defun *error* (x)(setvar "clayer" AA)(princ x) )
发表于 2014-7-27 08:30 | 显示全部楼层
cond缺少一个闭括号。
 楼主| 发表于 2014-7-27 09:03 | 显示全部楼层
好像是缺少一个闭括号,但程序运行正常。请问cond缺少一个闭括号应该加在哪?
发表于 2014-7-27 15:16 | 显示全部楼层
  1. (initget "Y N")
  2. (setq key (getkword "\n是否截断,执行/结束[Y/N] (N)"))
  3. (cond ((= key "Y") (C:zxx))
  4.       ((= key "N")
  5.        (setvar "CMDECHO" old_CMD)
  6.        (setvar "OSMODE" old_OS)
  7.        (setvar "clayer" AA)
  8.       )
  9. )
  10. (princ)
 楼主| 发表于 2014-7-28 08:44 | 显示全部楼层
非常谢谢院长的指导,但还有一个小问题,只有键盘输入N,图层会返回到原来设置,但直接按鼠标右键时,程序不会执行“恢复系统变量设置”。
发表于 2014-7-28 10:32 | 显示全部楼层
szx025 发表于 2014-7-28 08:44
非常谢谢院长的指导,但还有一个小问题,只有键盘输入N,图层会返回到原来设置,但直接按鼠标右键时,程序不 ...

院长那段代码是有问题的,正常的代码应该是这样:
  1. ;;定义自己的出错函数
  2. (defun newerror()...)     ;包括变量恢复
  3. ;;保存系统变量
  4. (setq oldv ...)
  5. (setq olde *error*)
  6. ;;设置系统变量和出错函数
  7. (setvar ......)
  8. (setq *error* newerror)
  9. ;;正常函数内容
  10. ......
  11. (cond
  12.   ((条件1) (执行内容1))
  13.   ((条件2) (执行内容2))
  14.   ...
  15.   (t nil)   ;不满足前面条件的其它情况下,什么都不做
  16. )    ;完整的测试
  17. ......
  18. ;;正常结束,恢复变量
  19. (setq ... oldv)
  20. (setq *error* olde)
  21. ...

测试函数本身应该完整,与程序的结束部分无关。
initget函数有一个控制位,对get类交互输入函数的输入进行限制,除非这个控制和测试的所有条件是“闭合”的,否则就应该在cond的最后加上类似(t nil)这种收尾的语句,这样在其它输入时(包括回车)不至于出错。

评分

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

查看全部评分

发表于 2014-7-28 11:04 | 显示全部楼层
ll_j 发表于 2014-7-28 10:32
院长那段代码是有问题的,正常的代码应该是这样:

测试函数本身应该完整,与程序的结束部分无关。

(t nil)   ;不满足前面条件的其它情况下,什么都不做
对于这句,要不要好象一样的。也返回nil
发表于 2014-7-28 11:44 | 显示全部楼层
自贡黄明儒 发表于 2014-7-28 11:04
(t nil)   ;不满足前面条件的其它情况下,什么都不做
对于这句,要不要好象一样的。也返回nil

这一句在很多时候是很重要的。
cond和if不同,if是非此即彼,但cond的测试条件不仅可以很多,而且可以互不关联,所以在很多时候无法把所有测试条件都列出来,这样就必须有一个“扎口袋”的在最后,所以剩下来的统统收拢,就像本帖所说的回车,一般不可能在关键字中,有时我们会判断一下,列进条件,有时并不判断,于是就“什么都不做”。
发表于 2014-7-28 12:54 | 显示全部楼层
  1. (setq key (UKWORD 1 "Y N" "是否截断: Y-执行/N-结束" key))
  2. (cond ((= key "Y") (c:zxx))
  3.       ((= key "N")
  4.        (setvar "CMDECHO" old_CMD)
  5.        (setvar "OSMODE" old_OS)
  6.        (setvar "clayer" AA)
  7.       )
  8. )
  9. (princ)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 17:35 , Processed in 0.784840 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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