找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1327|回复: 6

[] (XD::List:Assoc)支持容差的Assoc

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-8 23:30:49 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::List:Assoc
调用格式: ( XD::List:Assoc key lst)
参数说明: key --- 关联表KEY
lst --- 关联表
返回值: 关联表项 or nil
函数简介: 支持容差的ASSOC
函数来源: 原创
函数作者: Newer
适用版本: XDRX API 
最后更新时间: 2014-12-08
备注: 说明,对于点、数值型关键字,容差由函数 (xdrx_document_getprec)读取(xdrx_document_setprec ...)设置。
演示图片: -

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

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

×
  1. ;|
  2. 支持容差的ASSOC
  3. 参数: key --- 关联表KEY
  4.        lst --- 关联表
  5. 返回值: 关联表项 or nil
  6. 说明,对于点、数值型关键字,容差由函数 (xdrx_document_getprec)读取(xdrx_document_setprec ...)设置。
  7. |;
  8. (defun XD::List:Assoc (key lst /  val x)
  9.   (vl-some '(lambda (x)
  10.               (if (equal key (car x) (car (xdrx_document_getprec)))
  11.                 (setq val x)
  12.               )
  13.             ) lst
  14.   )
  15.   val
  16. )


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

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-8 23:55:45 来自手机 | 显示全部楼层
和(car (vl-member-if ……有什么优势?

点评

member返回的东西要多点,比如查询项在表很前面。  详情 回复 发表于 2014-12-9 00:11
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-12-9 00:11:00 | 显示全部楼层
st788796 发表于 2014-12-8 23:55
和(car (vl-member-if ……有什么优势?

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-9 00:24:29 来自手机 | 显示全部楼层
newer 发表于 2014-12-9 00:11
member返回的东西要多点,比如查询项在表很前面。


vl-some是有点像
{for (i = 0, i < lst.length,i++)
   {if (lst[ i ] == pam)
       return true;
    }
}
return false;

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2014-12-9 00:48:16 | 显示全部楼层
st788796 发表于 2014-12-9 00:24
vl-some是有点像
{for (i = 0, i < lst.length,i++)
   {if (lst[ i ] == pam)

是的,找到后马上退出循环。

点评

退出循环方法 _$ (xsome '(1 2 3 4) '(lambda (x) (= x 10))) nil _$ (xsome '(1 2 3 4) '(lambda (x) (= x 2))) 2 _$ (xsome '(1 2 3 4) '(lambda (x) (equal x 2 1))) 2 _$ (xsome '(1 2 3 4) '(lambda (  详情 回复 发表于 2014-12-9 09:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-9 09:18:40 | 显示全部楼层
newer 发表于 2014-12-9 00:48
是的,找到后马上退出循环。

退出循环方法
  1. (defun xsome (lst func / tf)
  2.   (vl-catch-all-apply
  3.     '(lambda ()
  4.        (foreach        x lst
  5.          (if (eval (cons func (list x)))
  6.            (progn
  7.              (setq tf x)
  8.              (exit)
  9.            )
  10.          )
  11.        )
  12.      )
  13.     nil
  14.   )
  15.   tf
  16. )

_$ (xsome '(1 2 3 4) '(lambda (x) (= x 10)))
nil
_$ (xsome '(1 2 3 4) '(lambda (x) (= x 2)))
2
_$ (xsome '(1 2 3 4) '(lambda (x) (equal x 2 1)))
2
_$ (xsome '(1 2 3 4) '(lambda (x) (equal x 2 1.1)))
1
_$





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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

发表于 2020-5-14 14:05:04 | 显示全部楼层
与下面函数的效率测试:
(defun xd::list:assoc-fuzz(lst1 lst fuzz)
        (while (and lst (not (equal (caar lst) lst1 fuzz)))
                (setq lst (cdr lst))
        );;;while
        (car lst)
);;;defun

(defun c:tt(/ i lst1 lst)
        (setq lst1 19999.0001)
        (setq i 1)
        (repeat 30000
                (setq lst (cons (list i i) lst)
                        i (1+ i)
                )
        )
        (xdrx_document_setprec 1e-3 0.01)
        (setq lst (reverse lst))
        (repeat 5
                  (xd::quickbench '((xd::list:assoc-fuzz lst1 lst 1e-3)(xd::list:assoc lst1 lst)))
        )
          (princ)
)

CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 128 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:ASSOC-FUZZ LST1...)      128      1485       1485     49.50 <fastest>
(XD::LIST:ASSOC LST1 LST)            4      2297      73504      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 128 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:ASSOC-FUZZ LST1...)      128      1437       1437     48.72 <fastest>
(XD::LIST:ASSOC LST1 LST)            4      2188      70016      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 128 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:ASSOC-FUZZ LST1...)      128      1438       1438     48.31 <fastest>
(XD::LIST:ASSOC LST1 LST)            4      2171      69472      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 128 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:ASSOC-FUZZ LST1...)      128      1468       1468     47.35 <fastest>
(XD::LIST:ASSOC LST1 LST)            4      2172      69504      1.00 <slowest>
-------------------------------------------------------------------------------
CPU:(1x)Intel(R) Core(TM) i7-7700 @ 3.60GHz 4Cores  / Memory:24G / OS:WIN10专业版
Benchmarking ....... done for 128 iterations. Sorted from fastest.
Statement                    Increment  Time(ms)  Normalize  Relative
-------------------------------------------------------------------------------
(XD::LIST:ASSOC-FUZZ LST1...)      128      1469       1469     47.66 <fastest>
(XD::LIST:ASSOC LST1 LST)            4      2188      70016      1.00 <slowest>
-------------------------------------------------------------------------------





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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 20:30 , Processed in 0.181221 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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