明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: nonsmall

[【不死猫】] [原创]LISP定义可选参数函数的调用

    [复制链接]
发表于 2009-1-11 19:55 | 显示全部楼层
好的
发表于 2009-3-18 14:08 | 显示全部楼层

嗯 ,学习了

发表于 2009-4-7 23:24 | 显示全部楼层

非常好,学习了,感谢。

发表于 2009-4-19 11:07 | 显示全部楼层
好东东,算上精通lisp了
发表于 2009-4-19 14:27 | 显示全部楼层
路过帮顶
发表于 2009-4-24 08:14 | 显示全部楼层
发表于 2009-8-23 21:36 | 显示全部楼层
本帖最后由 作者 于 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


可以这样精简一下代码
  1. ;| xxcall=LISP任意参数调用函数  ---修改by lxx.2009.8.23
  2. 格式: (xxcall (list 函数名 参数1 参数2 ...))
  3. 参考: nonsmall 的Call_func函数,http://bbs.mjtd.com/forum.php?mod=viewthread&tid=72144&replyID=&skin=1 修改内容:1.精简程序2.修正返回值.3支持c:xx 定义的命令.
  4. (defun c:tt ()(print "test"))
  5. (defun tt (a b c)(mapcar 'princ (list a b c)))
  6. (xxCall '(c:tt))
  7. (xxCall '(tt 1 2))
  8. (xxCall (list 'tt 1 (+ 2 2)))
  9. (xxCall '(tt 1 2 3 4))
  10. (xxCall '(tt 1 2 3))
  11. |:
  12. (defun xxCall (funclst / funs args i ret)
  13.   (setq funs (car funclst)
  14. i 0)
  15.   (while (vl-catch-all-error-p
  16.     (setq ret (vl-catch-all-apply funs args)))
  17.     (setq args (reverse(cons (nth (setq i (1+ i)) funclst) (reverse args))))
  18.   )
  19.   ret
  20. )
不过同时发现这个创意也是有风险的:对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]
发表于 2009-11-12 17:06 | 显示全部楼层

很想学习一下

发表于 2009-11-12 17:29 | 显示全部楼层
功底太浅,光给出核心代码 还是不会用:( 哪位高手能解释一下,或是给段例程!
发表于 2009-11-25 21:08 | 显示全部楼层

高难度动作 看不懂

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 05:24 , Processed in 0.312403 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表