首页 > 代码库 > newLISP序列化

newLISP序列化

newLISP序列化主要是指list表达式如何转换成string,存储在文件或者数据库中。然后读取并转换成list表达式。

先看简单的

list转换成string

(setf a ‘(1 2 3 4))
(1 2 3 4)
> (string a)
"(1 2 3 4)"

string转换成list

(list? (eval-string (string "‘" b)))
true

这行代码需要说明一下。需要使用eval-string才能将string转换成list.

并且注意需要前面加上单引号以表示这是个list。

(string "‘" b)
"‘(1 2 3 4)"

如果想还原(setf a ‘(1 2 3 4))到这个list表达式,还需要对b字符串添加如下代码:

(list? (eval-string (string "(setf a ‘" b ")")))
true

也就是添加(setf a 语句。

list保存到文件中

有了前面的基础,可以先将list转换成字符串,然后将字符串保存到文件中。比如:

  (if (string? graph-str)
      (write-file "graph-tmp.lsp" (string "(set ‘graph ‘"graph-str ")")))

注意,这里要么字符串中添加set 语句,要么添加单引号。

从文件中读取并得到list

然后用load语句直接加载文件

(load "graph-tmp.lsp")

list保存到数据库

将list转换成string,然后插入到数据库中。有了前面的基础,问题很简单。

读取数据库后变成list

从数据库中读取字符串,然后加上单引号或者setf语句后,用eval-string求值。


source和save

source和save可以将context信息也序列化成字符串,比如下面的代码:

> (new Tree ‘MyTree)
MyTree
> (MyTree "a" 1)
1
> (MyTree "b" 2)
2
> (source ‘MyTree)
"\n(context ‘MyTree)\n\n(set ‘_a 1)\n\n(set ‘_b 2)\n\n\n(context MAIN)\n\n"
> (save "mytree.lsp" ‘MyTree)
true

文件mytree.lsp的内容如下:

(context ‘MyTree)

(set ‘_a 1)

(set ‘_b 2)


(context MAIN)


newLISP序列化