在之前一篇在newlisp中使用table-driven模式曾经用过这个类型做table-driver模式。
这里将专门描述Tree如何使用。
创建字典
首先Tree是一个namesapce(也就是context),如果想创建一个字典保存key/value结构,需要如下使用:
(new Tree 'MyTable)
(MyTable "/home/a.cc" "123:45")
(MyTable "/home/b.cc" "123:46")
(MyTable "/home/c.cc" "123:47")
(MyTable "/home/d.cc" "123:48")
(MyTable "/home/e.cc" "123:49")
这样,其实是创建了一个名为MyTable的context,里面用symbol的形式保存了很多key/value的组合。
查询字典
读取的时候也很简单:
(MyTable "/home/a.cc")
"123:45"
添加数据和遍历
(while (read-line)
(set 'line-value (parse (current-line) "\t"))
(set 'key (line-value 0))
(set 'value (int (line-value 1)))
(set 'v (my-table key))
(if v
(my-table key (+ v value))
(my-table key value)
)
)
(dolist (item (my-table)) (println (item 0) "\t" (item 1)))
(exit)
这段代码演示了如何读取一行数据,分解出key和value,然后用key查找,如果有则累加value,如果没有则添加数据
最后,遍历所有的数据。
字典长度
(length (MyTable))
保存字典
(save "d2.lsp" 'MyTable)
这样MyTable里的所有数据都被保存到d2.lsp文件中,现在打开看一下:
(context 'MyTable)
(set '_/home/a.cc "123:45")
(set '_/home/b.cc "123:46")
(set '_/home/c.cc "123:47")
(set '_/home/d.cc "123:48")
(set '_/home/e.cc "123:49")
(context MAIN)
原来居然是很多的MyTable 中的变量,所以这其实是一个模拟的字典。目前我还不清楚其算法复杂度是多少?
读取字典文件
就是通用做法
(load "d2.lsp")
MAIN
现在可以使用了。