Undo处理

一个完善的程序应该有较好的出错处理,这是在所有Lisp教材上都提及的,但程序的Undo处理就说得很少或没有提及。
    其实Undo处理对程序来说也是非常重要的,尤其对有较多输出的复杂程序而言,不能解决Undo问题,使用起来会极不方便。
    对于Undo问题的解决,一种方法是尽量少用或不用command函数,即不调用原始命令,这是一种较好的方法,但必须注意的是,一段程序必须至少有一次调用command函数,否则Undo命令将取消程序运行前的前一次命令,解决的方法是在程序运行的起始位置加一个无谓的command,如“(command "color" "")”。
    有时不使用command函数不能达到我们要求的一些功能,或使得程序过于复杂,我们可能需要使用一些command函数(原始命令),这是就应该在程序中进行Undo处理,即使用Undo命令的编组功能。
    例五是一段程序出错函数与Undo处理的示例。
************************************************
;;例五
(defun newerr (s)                                    ;出错函数
  (if s
    (progn
      (term_dialog)                                 ;使用对话框时使用
      (if olderr (setq *error* olderr))             ;出错函数恢复
      (if oldvar (setvar ... oldvar))               ;系统变量恢复
      (if olderr (setq *error* olderr))             ;出错函数恢复
      (command "_.undo" "_e")                       ;Undo编组结束
    )
  )
  (princ)
)

(defun c:my(/ ...)                                  ;主程序(主函数)
  (setvar "cmdecho" 0)                              ;取消命令回显提示
  (command "_.undo" "_BE")                          ;Undo编组开始
  (setq olderr *error* *error* newerr)              ;调用自定义出错函数
  (setq oldvar (getvar ...))                        ;保存相关系统变量
  (setvar ...                                       ;设置系统变量
  ...                                               ;程序段
  ...
  (setvar ... oldvar)                               ;恢复系统变量
  (setq *error* olderr)                             ;恢复出错函数
  (command "_.undo" "_E")                           ;结束Undo命令编组
  (princ)                                           ;取消程序返回值
)
************************************************

标签:Undo 处理