szx025 发表于 2014-7-26 15:00:41

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

(initget "Y N") ;设置程序是否继续执行/结束
(setq key (getkword "\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") “”这几句了。

这个问题如何解决


1993063 发表于 2014-7-26 15:38:45

(Defun *error* (x)(setvar "clayer" AA)(princ x) )

edata 发表于 2014-7-27 08:30:18

cond缺少一个闭括号。

szx025 发表于 2014-7-27 09:03:21

好像是缺少一个闭括号,但程序运行正常。请问cond缺少一个闭括号应该加在哪?

xyp1964 发表于 2014-7-27 15:16:42

(initget "Y N")
(setq key (getkword "\n是否截断,执行/结束 (N)"))
(cond ((= key "Y") (C:zxx))
      ((= key "N")
       (setvar "CMDECHO" old_CMD)
       (setvar "OSMODE" old_OS)
       (setvar "clayer" AA)
      )
)
(princ)

szx025 发表于 2014-7-28 08:44:12

非常谢谢院长的指导,但还有一个小问题,只有键盘输入N,图层会返回到原来设置,但直接按鼠标右键时,程序不会执行“恢复系统变量设置”。

ll_j 发表于 2014-7-28 10:32:06

szx025 发表于 2014-7-28 08:44 static/image/common/back.gif
非常谢谢院长的指导,但还有一个小问题,只有键盘输入N,图层会返回到原来设置,但直接按鼠标右键时,程序不 ...

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

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

自贡黄明儒 发表于 2014-7-28 11:04:15

ll_j 发表于 2014-7-28 10:32 static/image/common/back.gif
院长那段代码是有问题的,正常的代码应该是这样:

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


(t nil)   ;不满足前面条件的其它情况下,什么都不做
对于这句,要不要好象一样的。也返回nil

ll_j 发表于 2014-7-28 11:44:11

自贡黄明儒 发表于 2014-7-28 11:04 static/image/common/back.gif
(t nil)   ;不满足前面条件的其它情况下,什么都不做
对于这句,要不要好象一样的。也返回nil

这一句在很多时候是很重要的。
cond和if不同,if是非此即彼,但cond的测试条件不仅可以很多,而且可以互不关联,所以在很多时候无法把所有测试条件都列出来,这样就必须有一个“扎口袋”的在最后,所以剩下来的统统收拢,就像本帖所说的回车,一般不可能在关键字中,有时我们会判断一下,列进条件,有时并不判断,于是就“什么都不做”。

xyp1964 发表于 2014-7-28 12:54:44

(setq key (UKWORD 1 "Y N" "是否截断: Y-执行/N-结束" key))
(cond ((= key "Y") (c:zxx))
      ((= key "N")
       (setvar "CMDECHO" old_CMD)
       (setvar "OSMODE" old_OS)
       (setvar "clayer" AA)
      )
)
(princ)
页: [1]
查看完整版本: 当输入N时,程序就结束了,不会再执行恢复系统变量设置