找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6398|回复: 7

[研讨] 关于 VL函数的一个陷阱

[复制链接]

已领礼包: 8125个

财富等级: 富甲天下

发表于 2013-12-26 22:50:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Highflybird 于 2013-12-26 22:58 编辑

首先我们来看一下:vl-remove
(vl-remove 4 '(1 2 4 5 4.0))
我们期望的结果是: '(1 2 5 )
但我们得到的结果却是:'(1 2 5 4.0)
那么我们用
(vl-remove 4.0 '(1 2 4 5 4.0))来试试看:
结果却是:'(1 2 4 5)
我们很奇怪的是 4 跟4.0是两个不同的元素。

同样我们来测试另外一个函数:vl-position
(vl-position 4 '(1 2 4.0))
==>nil
(vl-position 4.0 '(1 2 4.0))
==>2
可见4 跟4.0的确不同。

还有一个函数,vl-sort
(vl-sort '(1 2 4.0 4 4 2.0) '<)
==>(1 2 2.0 4.0 4)
如果相同的数中有整数,它会移除掉其他相等的元素。
(vl-sort (mapcar 'float '(1 2 4.0 4 4 2.0)) '<)
==>(1.0 2.0 2.0 4.0 4.0 4.0)
而对于浮点数来说,即使两个元素相等,它也不会移除。
所以我在这里提醒的一点就是: 在编程的时候我们需要注意到这个陷阱。






评分

参与人数 2D豆 +10 贡献 +1 收起 理由
/db_自贡黄明儒_ + 5 很给力!经验;技术要点;资料分享奖!
炫翔 + 5 + 1 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-12-26 23:15:44 | 显示全部楼层
可能是ADESK为了区别整数和浮点数吧,浮点数有误差,表里面显示的是4.0,可能实际有时候不是。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-12-26 23:16:47 | 显示全部楼层
对浮点数,判断相等一定要用差的绝对值小于一个极小数来判断。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8125个

财富等级: 富甲天下

 楼主| 发表于 2013-12-26 23:52:03 | 显示全部楼层
本帖最后由 Highflybird 于 2013-12-26 23:59 编辑

然而对于 4和4.0,
下面是成立的:
(eq 4 4.0)
==》T

试比较一下:
(member 4 '(1 2 4.0))
==>'(4.0)
(member 4.0 '(1 2 4))
==>'(4)

在这样的情况下,vl-remove 可以用vl-move-if来替代:
_$ (vl-remove-if '(lambda (x) (= x 4)) '(1 2 4 5 4.0))
(1 2 5)
_$ (vl-remove-if '(lambda (x) (= x 4.0)) '(1 2 4 5 4.0))
(1 2 5)

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-27 00:28:34 来自手机 | 显示全部楼层
XD:: List:GroupByIndex中就是将INT先Float后再vl-sort的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-12-27 08:11:16 | 显示全部楼层
看来在不是必须要INT的情况下,尽量Float
从来不依赖 vl-sort 来删重复
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-12-27 08:16:37 | 显示全部楼层
自定义的vl-remove就不会出问题{:soso_e112:}
(defun remove (lst ele) (apply 'append (subst nil (list ele) (mapcar 'list lst))))

点评

原来remove就是用nil替代里面和东西啊,666  详情 回复 发表于 2018-4-21 11:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-4-21 11:37:42 来自手机 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-12-27 08:16
自定义的vl-remove就不会出问题
(defun remove (lst ele) (apply 'append (subst nil (list  ...

原来remove就是用nil替代里面和东西啊,666
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 06:50 , Processed in 0.215520 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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