找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1839|回复: 6

[LISP函数-表]:含有精度检查的 Member

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-8-31 18:47:41 | 显示全部楼层 |阅读模式

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

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

×

  1. ;;   以下函数来自网上的均保留原作者信息, 转贴请注明出处并保持信息的完整
  2. ;; ! ***************************************************************************
  3. ;; ! LI_memb
  4. ;; ! ***************************************************************************
  5. ;; ! Function : MEMB - member with equal's uncertainty check (diff: real number)
  6. ;; ! Argument : 'ele'    - Element to check, if in list
  7. ;; !            'Lst'    - List to be checked
  8. ;; !            'diff'   - A fuzzy tolerance to check for equality
  9. ;; ! Returns  : The list index (starting from 0) where the first occurance of
  10. ;; !            'ele' is found else nil
  11. ;; ! Update   : May 2, 2004
  12. ;; ! e-mail   : [email]rakesh.rao@4d-technologies.com[/email]
  13. ;; ! Web      : [url]www.4d-technologies.com[/url]
  14. ;; ! ****************************************************************************
  15. ;; 含有精度检查的 Member,返回 T or nil
  16. (defun LI_memb (ele Lst diff / len cnt Found)
  17.   (if (zerop Diff)
  18.     (progn
  19.       (setq Found (member ele Lst))
  20.       (if Found
  21.         (setq Found T)
  22.       )
  23.     )
  24.     (progn
  25.       (setq
  26.         len   (length Lst)
  27.         cnt   0
  28.         Found nil
  29.       )
  30.       (while (and (< cnt len) (not Found))
  31.         (if (equal ele (nth cnt Lst) diff)
  32.           (setq Found T)
  33.           (setq cnt (1+ cnt))
  34.         )
  35.       )
  36.     )
  37.   )
  38.   (if Found
  39.     cnt
  40.     nil
  41.   )
  42. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-5-29 10:15:14 | 显示全部楼层
补充一个原创的

  1. ;|xmem = 有精度的member  by 雨箭风刀.2006.5
  2. 参数: a = 要比较的元素(可以是表)
  3.       lst = 表
  4.       f   = 精度值
  5. 返回: 表(截取第一个符合精度的及其后的元素) 或 nil.
  6. 测试:
  7. (setq a '(3.02 4.001) b nil lst '((1. 0.) nil(3.01 4.0)(1.0 0.1)nil(3.1 5.)))
  8. (xmem a lst 0.1) -> ((3.01 4.0) (1.0 0.1) nil (3.1 5.0))
  9. (xmem a lst 0.001) ->nil
  10. (xmem b lst 0.1) ->(nil (3.01 4.0) (1.0 0.1) nil (3.1 5.0))
  11. |;
  12. (defun xmem (a lst f / k)
  13.   (apply 'append (mapcar '(lambda(x)(if(or k (equal a x f))(setq k (list x)) nil))lst))
  14. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-6-29 13:46:53 | 显示全部楼层

  1. ;;equalmember ;
  2. ;; ;
  3. ;; check if "item" is in "lista" or not by equality test. with real number the ;
  4. ;; standard fuction "member" not work correctly. ;
  5. ;; ;
  6. (defun equalmember (item lista fuzzy /)
  7.   (apply 'or
  8.          (mapcar '(lambda (x) (equal x item fuzzy)) lista)
  9.   )
  10. )

另外一种,如果 equal 等的元素比较靠前,下面的也许更好

  1. (defun ybl-member (item lst diff / tf)
  2.   (setq tf t)
  3.   (while (and tf lst)
  4.     (if        (equal item (setq n (car lst)) diff)
  5.       (setq tf        nil
  6.             lst        (cdr lst)
  7.       )
  8.       (setq lst (cdr lst))
  9.     )
  10.   )
  11.   lst
  12. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-30 00:31:14 | 显示全部楼层
[php]
;| xmem = 含阈值的member --ok!----by 雨箭风刀.2006.6
格式: (xmem 元素 表 阈值)
测试:
(xmem 2.002 '(2.01 a "a" 2.0 3 0) 0.01) ->
(2.01 A "a" 2.0 3 0)
(xmem 2.002 '(a "a" 2.0 3 0) 0.01) ->(2.0 3 0)
(xmem 2.2 '(a "a" 2.0 3 0) 0.01) ->nil
|;
(defun xmem (a lst fz / lst2)
  (while (and (setq lst2 lst) (not(equal a (car lst) fz)))
    (setq lst(cdr lst))
  )
  lst2
)

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-8-18 22:30:22 | 显示全部楼层
为什么只提供一个精度呢?
提供一个func比较好


  1. (defun member0( func lst)
  2.   (while (and lst  (not (apply func(list (car lst)))))
  3.        (setq lst(cdr lst))
  4.   )
  5. )


命令: (MEMBER0 '(lambda(x)(equal x 5 1e-3)) '(2 3 4 5 6 ))
(5 6)

命令: (MEMBER0 '(lambda(x)(equal (car x) 5 1e-3)) '((2 3)(2 4)(5 3)(1 56)))
((5 3) (1 56))

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

使用道具 举报

发表于 2006-8-19 15:07:52 | 显示全部楼层
最初由 aeo 发布
[B]为什么只提供一个精度呢?
提供一个func比较好


  1. (defun member0( func lst)
  2.   (while (and lst  (not (apply func(list (car lst)))))
  3.        (setq lst(cdr lst))
  4.   )
  5.   lst ;;这个是不可以省略的.
  6. )


命令: (MEMBER0 ... [/B]



加func自然可以,不过
(xmem     5  '(2 3 4 5 6 ) 1e-3)
(MEMBER0 '(lambda(x)(equal x 5 1e-3)) '(2 3 4 5 6 ))
哪个调用更简便呢?

本来这么写就是想省去写equal的语句,可好你又给加回来了。要加func,我宁可这样:
[php]
(defun xmemx (a lst func fz )
  (while (and lst (not(equal a ((eval func) (car lst)) fz)))
    (setq lst (cdr lst))
  ) lst ;;这个是不可以省略的.
)[/php]
(setq lst '(2 3 4 5 6 7))
(xmemx -5 lst '-  1e-3)
-> (5 6 7)
(xmemx 2 lst '(lambda(x)(/ x 2)) 1e-3)
-> (4 5 6 7)
(xmemx  5 '((2 3)(2 4)(5 3)(1 56)) 'car 1e-5)
->((5 3) (1 56))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-9-29 23:01:31 | 显示全部楼层
最初由 雨箭风刀 发布
[B][QUOTE]最初由 aeo 发布
[B]为什么只提供一个精度呢?
提供一个func比较好

[code]
(defun member0( func lst)
  (while (and lst  (not (apply func(list (car lst)))))
       (setq lst(cdr lst))
... [/B]


其实我这么写,无非是说没必要写什么函数的
有"精度"要写一个,有"文字大小写"要写一个,还有很多机会会写
所以有了
vl-member-if (就是member0)
vl-member-if-not
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 06:13 , Processed in 0.202971 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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