Clojure 我如何坚持并恢复我的defstruct';什么是文件?
我想将数据持久化到一个文件中,并在重新运行程序时恢复数据 我已将我的defstruct定义为: (defstruct书签:url:标题:注释) 程序只需执行以下操作:Clojure 我如何坚持并恢复我的defstruct';什么是文件?,clojure,Clojure,我想将数据持久化到一个文件中,并在重新运行程序时恢复数据 我已将我的defstruct定义为: (defstruct书签:url:标题:注释) 程序只需执行以下操作: 1.从url db.txt加载defstruct 2.从传入*命令行args*的导入文件中读取,并添加到内部数据变量。 3.重写url-db.txt文件。 示例导入文件: www.cnn.com|新闻|这里是cnn www.msnbc.com |搜索| news.ycombinator.com | news | Tech news
1.从url db.txt加载defstruct
2.从传入*命令行args*的导入文件中读取,并添加到内部数据变量。
3.重写url-db.txt文件。
示例导入文件: www.cnn.com|新闻|这里是cnn
www.msnbc.com |搜索|
news.ycombinator.com | news | Tech news
使用spit和slurp(示例取自)。通常这种技术称为序列化
(defn save-db [db filename]
(spit
filename
(with-out-str (pr db))))
(defn load-db [filename]
(with-in-str (slurp filename)
(read)))
(早期的打印错误出现在原始代码中,我很笨,没有检查。谢谢)汤姆·克雷福德的答案很接近,但使用“pr”功能而不是“打印”。“pr”生成可以用“read”读回的字符串
请注意,如果将*print dup*设置为true,则此操作将不起作用。另请注意,当您读回数据库时,记录将是普通映射,而不是结构映射。结构映射还不能用pr/read序列化。(def x(结构书签“news.ycombinator.com”“news”“Tech news”);不处理“引用中的事物”他的例子中有一个引用中的名称。当我试图重新加载数据时,它不起作用(savedbx“url db.txt”)。。。(defy(loaddb“url db.txt”))仅仅是为了我自己的启发,你为什么使用in-str和with-out-str而不是使用read-string和pr-str?不太可能。不记得我为什么这样写。什么时候把它作为普通的映射而不是结构映射来阅读会是一个问题?我还没有遇到过一个它们不能互换的地方。不过,在这种情况下(根据需要进行概括),您可以在阅读时将每条记录合并到一个空书签中。有人在我之前被这个问题绊倒了:
(defn save-db [db filename]
(spit
filename
(with-out-str (pr db))))
(defn load-db [filename]
(with-in-str (slurp filename)
(read)))