nonsmall 发表于 2008-11-26 15:03:00

[原创]LISP定义可选参数函数的调用

本帖最后由 nonsmall 于 2013-5-13 11:43 编辑 <br /><br /> <p></p><p>学习VB时看到function函数可以定义可选参数的函数</p><p>LISP为什么不能呢</p><p>(defun go (a b c)<br/>&nbsp;(if a (print (list "a=" a)))<br/>&nbsp;(if b (print (list "b=" b)))<br/>&nbsp;(if c (print (list "c=" c)))<br/>&nbsp;(princ)<br/>)</p><p>命令: (go)<br/>; 错误: 参数太少</p><p>命令: (go 1)<br/>; 错误: 参数太少</p><p>命令: (go 1 2)<br/>; 错误: 参数太少</p><p>命令: (go 1 2 3)</p><p>("a=" 1)<br/>("b=" 2)<br/>("c=" 3)</p><p>命令: (go 1 2 3 4)<br/>; 错误: 参数太多</p><p>=================================================</p><p>下面定义一个Call_func函数用于可选参数调用</p><p></p><p></p><p></p><p>命令: (Call_func '(go))</p><p>命令: (Call_func '(go 1))</p><p>("a=" 1)</p><p>命令: (Call_func '(go 1 2))</p><p>("a=" 1)<br/>("b=" 2)</p><p>命令: (Call_func '(go 1 2 3))</p><p>("a=" 1)<br/>("b=" 2)<br/>("c=" 3)</p><p>命令: (Call_func '(go 1 2 3 4))</p><p>("a=" 1)<br/>("b=" 2)<br/>("c=" 3)</p><p>命令: (Call_func '(go 1 2 3 4 5))</p><p>("a=" 1)<br/>("b=" 2)<br/>("c=" 3)</p><p>命令: (Call_func '(go 1 nil 3))</p><p>("a=" 1)<br/>("c=" 3)</p><p>命令: (Call_func '(go nil nil 3))</p><p>("c=" 3)</p><p>这样Lisp也可以自己定义一个可选参数的函数 (defun 函数 ([参数] [参数] ...))</p><p>以后的Lisp函数调用过程会变得更加灵活!</p><p></p>

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





我爱lisp 发表于 2016-10-18 15:35:56

这个帖子很多年了,其实很好的思路,作为其他功能借鉴参考

guankuiwu 发表于 2021-1-7 18:17:10

很好很好!学习一下

caoyin 发表于 2008-11-26 15:16:00

<p><font face="Verdana" color="#61b713"><strong>nonsmall </strong></font><font face="Verdana" color="#61b713"><font color="#000000">总能玩出新花样,佩服,学习一下。</font></font></p><p><font face="Verdana">建议另外搞一个说明,而不要放在VLX文件中,这样便于大家使用,呵呵</font></p>

nonsmall 发表于 2008-11-26 15:21:00

程序核心代码

本帖最后由 作者 于 2008-11-26 15:47:01 编辑 <br /><br /> <p>谢谢caoyin大哥支持</p><p>那我就提供核心代码好了</p><p>这样大家只要Lisp学到一定程度自己都能写出来!</p><p>本程序核心代码 : (vl-every 'go 'nil 'nil)</p>

nonsmall 发表于 2008-11-26 15:28:00

本帖最后由 作者 于 2008-11-26 15:48:57 编辑 <br /><br /> <p>程序思路:vl-every函数用于判断函数的参数 根据传递的值补充参数的个数即可</p>

caoyin 发表于 2008-11-26 15:38:00

我的意思并不是要你公布源代码,是指说明文字不要放在vlx中,另外用个记事本写出来

caoyin 发表于 2008-11-26 15:44:00

程序别人能不能写出来不要紧,你钻研的劲头和思路是值得大家学习的

nonsmall 发表于 2008-11-26 16:00:00

<p>caoyin大哥过奖了</p><p>我是在明经长大的</p><p>目前我只有3个月的vlisp功力 实在拿不出手</p><p>看看早期明经前辈们的大作</p><p>我还有很多知识要学习的</p>

cnks 发表于 2008-11-26 16:34:00

还没注意这个,学习!

zml84 发表于 2008-11-26 16:50:00

呵呵,先定义后包装。
不过,_$ (call_func '(  )); ′íÎó: 2ÎêyààDí′íÎó: consp nil
意料之外

liminnet 发表于 2008-11-26 16:57:00

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