swamii 发表于 2022-5-24 18:13:23

表和点表有什么区别吗?能举个列子吗?

能举个列子吗?

e2002 发表于 2022-5-30 11:29:53

基本上可以这么理解:

LISP:dotpair 《=》 python:dict
LISP:list       《=》 python:list

vitalgg 发表于 2022-5-24 20:42:15

本帖最后由 vitalgg 于 2022-5-30 06:05 编辑




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

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

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

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

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

;; 表
(list a b c);; 结果 为
(a b c)
;; 等价于
(cons a (cons b (cons c nil)))


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



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

llsheng_73 发表于 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
表和点表可以互相转换,转点表容易,转表麻烦些
(defun lst2cons(lst);;表转点表很简单
(apply'vl-list* lst))
(defun cons2l(l / a);;点表转表要麻烦得多,得一个个遍历
(while(not(atom(setq a(cons(car l)a)l(cdr l)))))
(reverse(cons l a)))
;;当然也可以整合成一个,加上必要判断,可直接把表转成点表,点表转成表,其它的直接原样返回

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







masterlong 发表于 2022-5-24 19:52:13

点表仅两个元素
只能cons建立

元素个数不限
list建立

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

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

llsheng_73 发表于 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)
_$

muwind 发表于 2022-5-25 00:21:17

我喜欢叫点表为点对,因为他们是成对的
(cons 1 nil )返回的是 (1) , 为啥呢,因为lisp认为nil也是个表
点表的好处
可以用(assoc特征值   点对组成表)获取相应的数值,DXF组吗就这么干的。
用处我也不知道

vitalgg 发表于 2022-5-27 20:21:39

http://bbs.mjtd.com/thread-185578-1-1.html

这里给你详细解释了。

edata 发表于 2022-5-27 21:09:39


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

masterlong 发表于 2022-5-27 21:14:39

我就在想
楼主是不是已经被你们整蒙了圈啊

masterlong 发表于 2022-5-27 21:19:43

就好比要你们教小学生算数
结果你们一口气从自然数讲到负数讲到小数讲到分数讲到无理数讲到虚数
页: [1] 2
查看完整版本: 表和点表有什么区别吗?能举个列子吗?