明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1053|回复: 7

怎样得到多重点对?

[复制链接]
发表于 2008-5-25 13:58 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-5-25 13:59:42 编辑

也就是一个点对,其cdr仍是一个点对,如下。
  1. ("FBBBNB" .
  2.    ((1. ((1 . "01-9")
  3.   (81 . "06-17")
  4.         )
  5.     )
  6.     (2. ((1 . "02-9")
  7.   (4 . "02-10")
  8.   (62 . "02-4")
  9.         )
  10.     )
  11.     (3. ((1 . "03-9")
  12.   (62 . "03-4")
  13.         )
  14.     )
  15.     (4. ((1 . "04-9")
  16.   (62 . "04-4")
  17.         )
  18.     )
  19.     (5. ((1 . "05-9")
  20.   (4 . "05-10")
  21.         )
  22.     )
  23.     (6. ((1 . "01-17")
  24.   (62 . "01-14")
  25.         )
  26.     )
  27.     (7. ((1 . "02-17")
  28.   (62 . "02-14")
  29.         )
  30.     )
  31.     (8. ((1 . "03-17")
  32.   (62 . "03-14")
  33.         )
  34.     )
  35.     (9. ((1 . "04-17")
  36.   (62 . "04-14")
  37.         )
  38.     )
  39.     (10 .
  40.         ((1 . "05-17")
  41.   (82 . "06-18")
  42.         )
  43.     )
  44.    )
  45. )
复制代码
我用(cons "FBBBNB" (list ……)),这显得最后得到的是一个表,而不是点对。
发表于 2008-5-25 14:05 | 显示全部楼层
(cons 1 (list (cons 2 3)))
 楼主| 发表于 2008-5-25 14:08 | 显示全部楼层

我也是这样想的,但结果表明这样是不行的。

因为它返回的必然是(1 (2 . 3)),这个就不是点对了。

这样(assoc 1 lst)也不能得到(2 . 3)。

 楼主| 发表于 2008-5-25 14:16 | 显示全部楼层

想得到这个点对的目的其实想做一个查询表,因为比较庞大,我想用点对来查询。比如一楼的点对,我想(cdr (assoc "FBBBNB" lst))得到后面部分,再(cdr (assoc "3" lst))得到3后面那部分,再(cdr (assoc 62 lst))得到"03-4"。想法挺好,但却无法setq这个点对了。

发表于 2008-5-25 15:23 | 显示全部楼层
本帖最后由 作者 于 2008-5-25 15:24:56 编辑

其实就是

(setq lst (vl-list* 1 2 3))

$(1 2 . 3)

我们可以把他理解为 '(1 . (2 . 3))

(cdr lst)

$   '(2 . 3)

点对表的妙处在于和 assoc 和 cdr 函数的使用,例如:

(setq lst '((0 . "line")(62 . 5)(10 0 0 0)))

在使用 assoc 时,“点”前的元素就是索引序号

(cdr (assoc 62 lst))->5

(cdr (assoc 10 lst))->(0 0 0)

如果

(setq lst '((0  "line")(62  5)(10 0 0 0)))

(cadr (assoc 62 lst))->5

(cdr (assoc 10 lst))->(0 0 0)

说这么多,就是LISP语言本身是非常科学的,所以没有必要

要得到 '(1 . (2 . 3)) 的多重点对。楼主以为如何??

 楼主| 发表于 2008-5-25 15:49 | 显示全部楼层

我的目的是想实现一级一级查找某个表中的值。

如楼上所说用cdr与assoc套用在点对中去找。如果只有一级,那点对就行了,当存在多级的时候,我自然想到了多重点对。

用vl-list*我怎么去逐级查找呢?

或者有方法实现逐级查找,当然就没有必要非得用多重点对。

发表于 2008-5-25 16:02 | 显示全部楼层

那你可以这样

(setq lst '(1 (2 . 3)(4 . 5)))

而不要

(setq lst '(1 ((2 . 3)(4 . 5))))

???

 楼主| 发表于 2008-5-25 16:38 | 显示全部楼层

我已经用另外的方法暂时解决了目前的问题,但是感觉太麻烦,还是多重点对方便。

您说的方法,我再研究研究。

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

本版积分规则

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

GMT+8, 2024-5-2 10:15 , Processed in 0.449438 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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