Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 我如何坚持并恢复我的defstruct';什么是文件?_Clojure - Fatal编程技术网

Clojure 我如何坚持并恢复我的defstruct';什么是文件?

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

我想将数据持久化到一个文件中,并在重新运行程序时恢复数据

我已将我的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

使用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)))