出错程序就自然中断,再常见不过!
又没有想过好好利用一下呢?
下面用就好好利用出错中断的特性包装成两个函数!- ;;无声退出
- (defun fsxm-silenceexit (/ *error*)
- (t (setq *error* strcat))
- )
解说fsxm-silenceexit
这个是我最常用到的一个函数了!
有了它,代码会更优雅!
比如最常用的结构- (defun c:test ()
- (setq ss (ssget))
- (if ss
- (progn
- ........主程序模块........
- )
- )
- )
- ;;使用fsxm-silenceexit的
- (defun c:test ()
- (setq ss (ssget))
- (or ss (fsxm-silenceexit))
- ........主程序模块........
- )
绝大多数要求用户输入,都要检查数据合法性。
这样处理去了一层难看的括号,程序条理更分明!- ;;带return的apply
- (defun Fsxm-Apply ($Sym $Lst / $$ return $rt)
- (defun Return (var) (setq Return nil) (setq $$ var) (exit))
- (setq $rt (vl-catch-all-apply $Sym $Lst))
- (if Return $rt $$)
- )
解说Fsxm-Apply
一般说来Lisp的函数,只能一路执行到底,返回函数最后一个表达式的值。
试试Fsxm-Apply!集成一个类似于C语言的return功能!让你随时随地的结束函数,返回值!
特别应用就是在深层递归中退出。
如下例:找到第一个适合的文件就能立刻退出
用法:
(fsxm-searchfile 目录 文字样板 限时)
(fsxm-searchfile "c:" "*.lsp" 10)- ;;查找一个文件
- (defun fsxm-searchfile (path pate time / t0 t1 dir)
- (defun dir (paths / find lst paths2 strcat_ph)
- (defun strcat_ph (lst)
- (mapcar '(lambda (a) (strcat ph "\" a)) lst)
- )
- (while paths
- (setq paths2 nil)
- (foreach ph paths
- (if (> (getvar "TDUSRTIMER") t1)
- (return nil)
- ) ;超时退出
- (if (setq find (vl-directory-files ph pate))
- (return (strcat ph "\" (car find)))
- ) ;找到退出
- (if (and (setq lst (vl-directory-files ph nil -1))
- (if (= (car lst) ".")
- (setq lst (cddr lst))
- t
- )
- )
- (setq paths2 (cons (strcat_ph lst) paths2))
- )
- )
- (setq paths (apply 'append paths2))
- )
- )
- (setq path (list path))
- (setq t0 (getvar "TDUSRTIMER"))
- (setq t1 (+ t0 (/ time 86400.0)))
- (fsxm-apply 'dir (list path))
- )
注:FSTL各版本的函数库都收录有以上函数。
|