找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: 陌生人

[讨论]:如何将表炸开?

[复制链接]
发表于 2004-1-27 21:23:53 | 显示全部楼层
在替换点对时,要判断点是否位于一个字符串内。不位于的才能取消 否则要留下。
因此,要一个字符一个字符的判断来去掉点对的"."
不能简单地vl-string-subst
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-1-27 21:42:35 | 显示全部楼层
最初由 陌生人 发布
[B]再测试。
_$ (setq a '(2 3 . 4) b '(2 (3 . 4)))
(2 (3 . 4))
_$ (cadr a)
3
_$ (cadr b)
(3 . 4)
_$ (last a)

错误: 列表错误: 4
_$ (last b)
(3 . 4)
_$ (cddr a)
4
_$ (cddr b)
nil
_$ (cdr a)... [/B]


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

使用道具 举报

 楼主| 发表于 2004-1-27 22:16:20 | 显示全部楼层
回16楼:
如果是这样的
_$ (setq b (strcat "a" (chr 34) (chr 34) "b"))
"a\"\"b"
_$ (setq a (strcat "a" (chr 34) "b"))
"a\"b"
_$ (setq lst (list (list 2 (eval a)) 2 3))
((2 "a\"b") 2 3)

字符中含有",如何判断“的出口入口?不行吧?

你的测试本身是个错误
assoc是从(list (cons ..))中取
(assoc 3(list(cdr '(2 3 . 4))))  

只有说结论是错误,那里有测试是错误的说法。测试结果是从电脑出来的,怎么是错误?要错也是电脑错啊。
这样测试正是为了检验这个表的特性。既然是测试,当然什么都试试。
也正是由测试得出结论,'(2 3 . 4) 不是通常意义上的点对表,不能直接一次用cdr得出索引数据(本例为4). 要提取4。
_$ (cddr '(2 3 . 4))
4
其中一个d是将点对做成表,而另外一个d是用来提取4
而他又和普通表不同,请看
_$ '(2 3 4 5)
(2 3 4 5)
_$ '(2 3 4 . 5)
(2 3 4 . 5)
_$ '(2 3 . 4 5)

错误: 输入的点对中含有多余的 cdrs
_$
可见,点对后面不能有另外的元子,由此看来,这个表是介于正常表(如(1 2 3))和点对表(如 (2 . "a")) 之间的一种表(特性更接近双元点对表),和前两者都不同。'(2 3 . 4)中的点对在这个表里面不仅仅是一个元素(注意,不是表),而且是一个“终结符”。
_$ (assoc 2 '((2 . 3)))
(2 . 3)
_$ (assoc 2 '((2 3 . 4)))
(2 3 . 4)
_$ (assoc 3 '(2 3 . 4))
错误: 关联列表错误: (2 3 . 4)
_$ (cadr '(2 3 . 4))
3
可以这么理解,'(2 3 . 4)中,2 3是一个复合的索引,具有普通表的特性。可以通过索引头2来得到复合点对表,但是取出数据4,必须先找到索引尾3。而简单的点对'(3 . 4)可以认为索引头=索引尾=3。在这个意义上,甚至可以认为 2 3 . 4是一个复合的原子.这是从点对的角度来理解。
另外,也可以从表的角度来理解,'(2 3 . 4)中含两个元子,一个是2,一个是3 . 4。
(我做了一个图解,从计算机存储单元的角度来理解三者关系,请看附图) 

因此,点对和点对表是两个不同的概念(cad汉化帮助中对此似乎没有加以明确区分),在本例中,3 . 4 是点对,(3 . 4)是点对表,2 3 .4是复索引点对(也可理解为两个原子),而'(2 3 . 4)可以称之为复索引点对表。
因此,程序中要使用这样的表,应该慎重。因为它有很多限制,提取数据(即4)也很不容易,如果是(1 2 3 4 . 5)呢?如果表中元素个数不定,要提取点对的数据很罗嗦。
这就是我的结论,请批评指正。谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-29 10:13:51 | 显示全部楼层
你可以参照以下BONUS的PQCHECK.LSP程序,
建立一个计数标记,读到一个“号,计数加一,
对每个非“字符,当计数为奇数时,位于字符串内,直接复制,
否则在字符串外,该怎么处理怎么处理。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-29 15:46:36 | 显示全部楼层
我上贴就是说这样不行。如果是表转字符串可以,
如果是这样的
_$ (setq b (strcat "a" (chr 34) (chr 34) "b"))
"a\"\"b"
_$ (setq a (strcat "a" (chr 34) "b"))
"a\"b"
_$ (setq lst (list (list 2 (eval a)) 2 3))
((2 "a\"b") 2 3)

字符中含有",如何判断“的出口入口?不行吧?
这里说的是:((2 "a\"b") 2 3)是一个表,如果要把字符串“((2 "a\"b") 2 3)”转为((2 "a\"b") 2 3),“的记数失去作用,有一个”不能计数。
如果是"((2 "a\"\"b") 2 3)" -> ((2 "a\"\"b") 2 3) ? 中间有两个“ 不能计数。因为"a\"b" 和"a\"\"b"本身就是一个单独的字符串。不应该把他们拆分了。

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

使用道具 举报

发表于 2004-1-29 20:26:25 | 显示全部楼层
按照大多数情况下的正常思维,“”作为字符串的标志应该成对出现,虽然单个在理论上存在,但大多数情况下我们是不这样用的。
我觉得程序为此去专门处理的意义不大
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-29 21:11:36 | 显示全部楼层
哦?
刚好前几天wkai问了有关实体表转字符再转表的问题。

_$ (vl-prin1-to-string (entget(car(entsel))))
"((-1 . <图元名: 4009de48>) (0 . \"CIRCLE\") (330 . <图元名: 4009dc10>) (5 . \"91\") (100 . \"AcDbEntity\") (67 . 0) (410 . \"Model\") (8 . \"0\") (100 . \"AcDbCircle\") (10 21191.3 10183.5 0.0) (40 . 3035.94) (210 0.0 0.0 1.0))"
_$
如果用逐个读取字符串的方法,对\"还是要处理的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-29 23:03:56 | 显示全部楼层
我的解答:

  1. (defun 2nd (/ lst1)

  2.   (defun atlst (lst)
  3.     (cond
  4.       ((not lst) nil)
  5.       ((atom lst) (list lst))
  6.       ((append (atlst (car lst)) (atlst (cdr lst))))
  7.     )
  8.   )

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

使用道具 举报

 楼主| 发表于 2004-1-29 23:33:59 | 显示全部楼层
好程序!总算付出水面了。
对表的理解很充分,两次自身调用用的很好
建议加分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 00:11 , Processed in 0.180191 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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