redcat
发表于 2013-5-12 13:04:12
本帖最后由 redcat 于 2013-5-12 13:05 编辑
狂刀所说bug已修复;;Lisp-可选参数调用
(defun xxcall (funclst / funs args ret tmp)
(setqfuns (car funclst)
tmp(cdr funclst)
)
(if (= (type (eval funs)) 'SUBR)
(setq ret (eval funclst))
(while
(and (vl-catch-all-error-p
(setq ret (vl-catch-all-apply funs args))
)
(not(wcmatch
(vl-catch-all-error-message ret)
"参数类型错误:*"
)
)
)
(setq args (reverse (cons (car tmp) (reverse args)))
tmp(cdr tmp)
)
)
)
ret
)
;;;工程实例
(defun tt (a b c)
(apply '+ (list a b c))
)
(defun go (a b c)
(list (if a
a
)
(if b
51
b
)
(if c
c
93
)
)
)
(defun tt1 (a b c)
(mapcar 'princ (list a b c))
)
(xxcall '(go nil 2))
(xxcall '(tt 1 2 3 4))
(xxcall '(tt 1 2))
(xxcall '(tt1 1 2))
(xxcall '(+ 2000 4 8))
(xxcall '(print 2000))
(xxcall '(princ 2000 we))
wangph
发表于 2016-7-19 07:56:41
一样不完美,(xxcall '(tt 1 2))就是死循环
我爱lisp
发表于 2016-10-18 15:35:56
这个帖子很多年了,其实很好的思路,作为其他功能借鉴参考
guankuiwu
发表于 2021-1-7 18:17:10
很好很好!学习一下
moshouhot
发表于 2024-7-13 22:01:57
函数名: xxCall
功能:
这个函数是一个通用的函数调用包装器,它可以灵活地尝试用不同数量的参数
调用给定的函数,直到找到一个成功的调用或达到最大尝试次数。
特点:
1. 灵活性: 能够处理无参数、参数不足、参数过多等各种情况
2. 错误处理: 使用 vl-catch-all-apply 捕获并处理可能的错误
3. 调试信息: 提供详细的执行过程信息,有助于理解函数的运行情况
4. 参数使用跟踪: 报告哪些参数未被使用
5. 安全性: 设置最大尝试次数,防止无限循环
参数:
funclst: 一个列表,其中第一个元素是要调用的函数名,后续元素是传递给该函数的参数
例如: '(myfunction arg1 arg2 arg3)
返回值:
- 如果函数调用成功,返回函数的执行结果
- 如果所有尝试都失败,返回 nil
使用示例:
(xxCall '(myfunction 1 2 3))
(xxCall '(+ 1 2 3 4))
注意:
此函数会打印详细的执行过程信息。在生产环境中使用时,可能需要注释掉一些 princ 语句。