明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 34064|回复: 86

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

    [复制链接]
发表于 2008-11-26 15:03:00 | 显示全部楼层 |阅读模式
本帖最后由 nonsmall 于 2013-5-13 11:43 编辑

学习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=" c)))
 (princ)
)

命令: (go)
; 错误: 参数太少

命令: (go 1)
; 错误: 参数太少

命令: (go 1 2)
; 错误: 参数太少

命令: (go 1 2 3)

("a=" 1)
("b=" 2)
("c=" 3)

命令: (go 1 2 3 4)
; 错误: 参数太多

=================================================

下面定义一个Call_func函数用于可选参数调用

[Post=10]

[/Post]

命令: (Call_func '(go))

命令: (Call_func '(go 1))

("a=" 1)

命令: (Call_func '(go 1 2))

("a=" 1)
("b=" 2)

命令: (Call_func '(go 1 2 3))

("a=" 1)
("b=" 2)
("c=" 3)

命令: (Call_func '(go 1 2 3 4))

("a=" 1)
("b=" 2)
("c=" 3)

命令: (Call_func '(go 1 2 3 4 5))

("a=" 1)
("b=" 2)
("c=" 3)

命令: (Call_func '(go 1 nil 3))

("a=" 1)
("c=" 3)

命令: (Call_func '(go nil nil 3))

("c=" 3)

这样Lisp也可以自己定义一个可选参数的函数 (defun 函数 ([参数] [参数] ...))

以后的Lisp函数调用过程会变得更加灵活!

[Post=10]

[/Post]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2威望 +1 明经币 +6 金钱 +10 贡献 +5 激情 +5 收起 理由
自贡黄明儒 + 1
Longfin + 1 + 5 + 10 + 5 + 5 【好评】好思路

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 收集|主题: 58, 订阅: 4
发表于 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 语句。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2016-10-18 15:35:56 | 显示全部楼层
这个帖子很多年了,其实很好的思路,作为其他功能借鉴参考
发表于 2021-1-7 18:17:10 | 显示全部楼层
很好很好!学习一下
发表于 2008-11-26 15:16:00 | 显示全部楼层

nonsmall 总能玩出新花样,佩服,学习一下。

建议另外搞一个说明,而不要放在VLX文件中,这样便于大家使用,呵呵

 楼主| 发表于 2008-11-26 15:21:00 | 显示全部楼层

程序核心代码

本帖最后由 作者 于 2008-11-26 15:47:01 编辑

[Post=10]

谢谢caoyin大哥支持

那我就提供核心代码好了

这样大家只要Lisp学到一定程度自己都能写出来!

本程序核心代码 : (vl-every 'go 'nil 'nil)

[/Post]
 楼主| 发表于 2008-11-26 15:28:00 | 显示全部楼层
本帖最后由 作者 于 2008-11-26 15:48:57 编辑

[Post=10]

程序思路:vl-every函数用于判断函数的参数 根据传递的值补充参数的个数即可

[/Post]
发表于 2008-11-26 15:38:00 | 显示全部楼层
我的意思并不是要你公布源代码,是指说明文字不要放在vlx中,另外用个记事本写出来
发表于 2008-11-26 15:44:00 | 显示全部楼层
程序别人能不能写出来不要紧,你钻研的劲头和思路是值得大家学习的
 楼主| 发表于 2008-11-26 16:00:00 | 显示全部楼层

caoyin大哥过奖了

我是在明经长大的

目前我只有3个月的vlisp功力 实在拿不出手

看看早期明经前辈们的大作

我还有很多知识要学习的

发表于 2008-11-26 16:34:00 | 显示全部楼层
还没注意这个,学习!
发表于 2008-11-26 16:50:00 | 显示全部楼层
呵呵,先定义后包装。
不过,
  1. _$ (call_func '(  )); ′íÎó: 2ÎêyààDí′íÎó: consp nil
复制代码
意料之外
发表于 2008-11-26 16:57:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 21:39 , Processed in 0.224576 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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