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 语句。





页: 1 2 3 4 5 6 7 8 [9]
查看完整版本: [原创]LISP定义可选参数函数的调用