本帖最后由 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))
|