本帖最后由 作者 于 2009-8-24 0:59:13 编辑
[Point=3]nonsmall发表于2008-11-26 15:03:00学习VB时看到function函数可以定义可选参数的函数LISP为什么不能呢(defun go (a b c) (if a (print (list \"a=\" a))) (if b (print (list \"b=\" b))) (if c (print (list \"c
可以这样精简一下代码- ;| xxcall=LISP任意参数调用函数 ---修改by lxx.2009.8.23
- 格式: (xxcall (list 函数名 参数1 参数2 ...))
- 参考: nonsmall 的Call_func函数,http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72144&replyID=&skin=1 修改内容:1.精简程序2.修正返回值.3支持c:xx 定义的命令.
- (defun c:tt ()(print "test"))
- (defun tt (a b c)(mapcar 'princ (list a b c)))
- (xxCall '(c:tt))
- (xxCall '(tt 1 2))
- (xxCall (list 'tt 1 (+ 2 2)))
- (xxCall '(tt 1 2 3 4))
- (xxCall '(tt 1 2 3))
- |:
- (defun xxCall (funclst / funs args i ret)
- (setq funs (car funclst)
- i 0)
- (while (vl-catch-all-error-p
- (setq ret (vl-catch-all-apply funs args)))
- (setq args (reverse(cons (nth (setq i (1+ i)) funclst) (reverse args))))
- )
- ret
- )
不过同时发现这个创意也是有风险的:对func函数中如有'+,或read等支持不确定参数或接受nil参数的函数,会造成死循环.
如:
(defun tt (a b c)(apply '+ (list a b c))) ;; 函数缺陷.
(defun tt2(a b c)(mapcar 'read (list a b c))) ;; 函数缺陷.
(call_func '(tt 1 2)) ;; 死循环
(call_func '(tt2 1 2)) ;; 死循环
我修改的函数也一样,还没时间写规避代码。
看来这个函数要强壮起来还是有工作要做的
[/Point] |