明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1885|回复: 16

[提问] 表和点表有什么区别吗?能举个列子吗?

[复制链接]
发表于 2022-5-24 18:13:23 | 显示全部楼层 |阅读模式
能举个列子吗?
发表于 2022-5-30 11:29:53 | 显示全部楼层
基本上可以这么理解:

LISP:dotpair 《=》 python:dict
LISP:list       《=》 python:list
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-24 20:42:15 | 显示全部楼层
本帖最后由 vitalgg 于 2022-5-30 06:05 编辑




  1. ;; 点表由两部分组成 a b  , 表示 形式为 ( a  .    b)
  2. ;; car 得到点表的前半部分, cdr 得到后半部分。

  3. ;; 当后半部分为 nil 或一个表时, 形成 我们常识中的表。  
  4. ;; 如
  5. (cons a nil)  ;; 结果 为 (a)

  6. ;; 点表
  7. (cons a b)  ;; 结果为   (a   .   b)

  8. ;;下面两个是等价的
  9. (a b c)
  10. (a . (b . (c . nil)))

  11. ;;下面两个是等价的
  12. (a b (c d))
  13. (a . (b . ((c . (d . nil)) . nil)))
  14. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  15. ;; 表
  16. (list a b c)  ;; 结果 为
  17. (a b c)
  18. ;; 等价于
  19. (cons a (cons b (cons c nil)))


结论: 表(普通表)是由一系列点表组成的,  点表(点对)才是lisp系统 的基本单元。



@lisp 开源项目  https://gitee.com/atlisp
期待您的加入

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-24 21:02:32 | 显示全部楼层
本帖最后由 llsheng_73 于 2022-5-24 21:44 编辑

表是lisp里边最常用的,点对可以说是特殊的表,它有部分表的特性,可以使用部分表处理函数,但因为它的特殊性,很多表处理函数无法使用
比如:
(type '(1 2 3))
LIST
_$ (type '(1 2 . 3))
LIST
_$ (vl-consp'(1 2 3))
T
_$ (vl-consp'(1 2 . 3))
T
_$ (cdr'(1 2 3))
(2 3)
_$ (cdr'(1 2 . 3))
(2 . 3)
_$ (cddr'(1 2 . 3))
3
_$ (cddr'(1 2 3))
(3)
_$ (nth 0'(1 2 3))
1
_$ (nth 0'(1 2 . 3))
1
_$ (nth 2'(1 2 3))
3
_$ (nth 2'(1 2 . 3))
; 错误: 列表错误: 3
_$ (vl-every'atom'(1 2 3))
T
_$ (vl-every'atom'(1 2 . 3))
; 错误: 列表错误: 3
_$ (length '(1 2 3))
3
_$ (length'(1 2 . 3))
; 错误: 列表错误: 3

_$(last '(1 2 3 . 4))
; 错误: 列表错误: 4
表和点表可以互相转换,转点表容易,转表麻烦些
  1. (defun lst2cons(lst);;表转点表很简单
  2.   (apply'vl-list* lst))
  3. (defun cons2l(l / a);;点表转表要麻烦得多,得一个个遍历
  4.   (while(not(atom(setq a(cons(car l)a)l(cdr l)))))
  5.   (reverse(cons l a)))
  6. ;;当然也可以整合成一个,加上必要判断,可直接把表转成点表,点表转成表,其它的直接原样返回

  7. (defun cons2lst(lst / a);;;表和点表互转
  8.   (if(vl-consp lst)
  9.     (if(numberp(vl-catch-all-apply'length(List lst)))(apply'vl-list* lst)
  10.       (progn(while(not(atom(setq a(cons(car lst)a)lst(cdr lst)))))
  11.         (reverse(cons lst a))))
  12.     lst))







发表于 2022-5-24 19:52:13 | 显示全部楼层
点表仅两个元素
只能cons建立

元素个数不限
list建立

'(1 2) 不等于'(1 . 2)

另外注意下cons的用法
它其实具备两个功能
一个是建立点表
一个是往任意表的开头
添加一个元素

点评

点表也可以有很多元素,也不是只能通过cons来构建,比如vl-list*也 是可以的  发表于 2022-5-24 21:06
发表于 2022-5-24 21:04:29 | 显示全部楼层
本帖最后由 llsheng_73 于 2022-5-24 21:10 编辑
masterlong 发表于 2022-5-24 19:52
点表仅两个元素
只能cons建立

点表仅两个元素?  
'(1 2 3 4 5 . 6)
只能cons建立?
(vl-list* 1 2 3 4)->’(1 2 3 . 4)



$ (setq lst '(1 2 3 4 5 6) l2 7)
7
_$ (apply'vl-list*(append lst(List l2)))
(1 2 3 4 5 6 . 7)
_$

点评

你说的我知道,可是没有实际意义的数据类型,对楼主的问题或者他学习lisp有帮助吗  发表于 2022-5-25 09:45
发表于 2022-5-25 00:21:17 | 显示全部楼层
我喜欢叫点表为点对,因为他们是成对的
(cons 1 nil )返回的是 (1) , 为啥呢,因为lisp认为nil也是个表
点表的好处
可以用(assoc  特征值   点对组成表)获取相应的数值,DXF组吗就这么干的。
用处我也不知道
发表于 2022-5-27 20:21:39 | 显示全部楼层
http://bbs.mjtd.com/thread-185578-1-1.html

这里给你详细解释了。
发表于 2022-5-27 21:09:39 | 显示全部楼层

来自清华大学二次开发教案 2.4 数据的存储结构
4 点对(dotted pair)
点对是一种特殊的表。若表只有两个元素,且每个元素都
是原子,这样的表可以用点对表示。点对的形式为(原子. 原
子),如(0 . "LINE")、(8 . "A1")、(40 . 15.0)。用一个结
点存放点对,结点的左指针指向第一个元素,右指针指向第二
个元素。图是只有两个元素(元素为原子)的表的存储结构,
图(b)是点对的存储结构。从图中不难得出结论,两个元素
都是原子的表,用点对会节省存储空间。点对的另一个特点是
简化了某些函数对表的运算。由于点对具有这些优点,因此是
AutoLISP常用的数据结构。

本帖子中包含更多资源

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

x
发表于 2022-5-27 21:14:39 | 显示全部楼层
我就在想
楼主是不是已经被你们整蒙了圈啊
发表于 2022-5-27 21:19:43 | 显示全部楼层
就好比要你们教小学生算数
结果你们一口气从自然数讲到负数讲到小数讲到分数讲到无理数讲到虚数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 15:19 , Processed in 0.172954 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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