超越列表

; 超越列表,点对的其他用法(树 集合 查询表)
; 点对单元的链接,可以看成列表可以看成树
; 从第一个点对沿着cdr一直往下走,直到遇到nil,列表元素就是点对的car所引用的对象
(defparameter *list* '((1 2) (3 4) (5 6)))
; ○○→○○→○○
; ↓ ↓ ↓
; ○○ ○○ ○○
; 点对单元如上所示,列表结构只包含最上面三个单元
; 数结构包含5,6,7三行
; 列表函数和数函数的区别
(copy-list *list*)
; ○○→○○→○○
; ↓ ↓ ↓
; ○○ ○○ ○○
; ↑ ↑ ↑
; ○○→○○→○○
; 上图最后一行是copy-list的结果
(copy-tree )
; ○○→○○→○○
; ↓ ↓ ↓
; ○○ ○○ ○○
; ○○→○○→○○
; ↓ ↓ ↓
; ○○ ○○ ○○
; 上图是copy-tree的结果,复制了所有点对
; 对于点对单元中的原子值 1 2 3 4 5 6 nil是原来的树copy-tree唯一共享的
 
; (tree-equal)比较两棵树,形状一样,叶子eql时认为相等,可以设置:test
; subst subst-if subst-if-not 替换树
; nsubst nsubst-if nsubst-if-not 替换树的回收性版本
(subst 10 1 '(1 2 (3 2 1) ((1 1) (2 3))))
; (10 2 (3 2 10) ((10 10) (2 3)))
; 必须总是保存这些函数返回值,无法保证树eq等价
 
; 集合,列表在集合论意义上的操作
; 列表越大时,集合操作越低效
; 内置集合函数处理小的集合很高效,如果成为瓶颈了要改成构建在哈希表和向量上的集合
; 构造集合使用ADJOIN函数 (adjoin 项 代表集合的列表)
; 如果代表集合的列表中有 项,则返回此列表;没有则创建点对,让其指向先前的列表并返回
; ADJOIN 接受:key :test参数,和cons一样不会修改原来的列表,通过setf修改或者pushnew宏
(defparameter *set* ())
(adjoin 1 *set*)
*set*;nil
(setf *set* (adjoin 1 *set*));(1)
(pushnew 2 *set*)
(pushnew 3 *set*)
*set*;(3 2 1)
; 判断是否在集合中使用MEMBER MEMBER-IF MEMBER-IF-NOT
; 不在返回nil,在返回含有改项的点对单元
(member 3 *set*);(3 2 1)
(member 2 *set*);(2 1)
; 批量操作,都接受:key :test,返回新的列表
; INTERSECTION UNION SET-DIFFERENCE SET-EXCLUSIVE-OR
 
; 回收性版本
; NINTERSECTION NUNION NSET-DIFFERENCE NSET-EXCLUSIVE-OR
 
; 子集判断subsetp
(subsetp '(1 2) '(4 2 1));t
 
 
; 查询表alist和plist
 
 
 
 




posted @ 2012-04-13 16:02  舜耕山翁  阅读(152)  评论(0编辑  收藏  举报