【问题标题】:How do I persist and restore my defstruct's to a file?如何将我的 defstruct 持久化并恢复到文件中?
【发布时间】:2009-08-18 04:12:53
【问题描述】:

我想将我的数据保存到一个文件中,并在我重新运行程序时恢复数据。

我已经这样定义了我的 defstruct:

(defstruct 书签 :url :title :cmets)

程序将简单地执行以下操作:
1. 从 url-db.txt 加载 defstruct
2. 从传入 *command-line-args* 的导入文件中读取并添加到内部数据变量中。
3.重写url-db.txt文件。

示例导入文件:

www.cnn.com|新闻|这里是 CNN
www.msnbc.com|搜索|
news.ycombinator.com|新闻|科技新闻

【问题讨论】:

标签: clojure


【解决方案1】:

Tom Crayford 的答案很接近,但使用“pr”函数而不是“print”。 "pr" 产生可以用 "read" 读回的字符串。

(defn save-db [db filename]
  (spit 
   filename 
   (with-out-str (pr db))))

(defn load-db [filename] 
  (with-in-str (slurp filename)
    (read)))

请注意,如果 *print-dup* 设置为 true,这将不起作用。参见ticket #176 另请注意,当您重新读入数据库时​​,记录将是普通映射,而不是结构映射。结构图还不能用 pr/read 序列化。

【讨论】:

  • 只是为了我自己的启迪,您使用 with-in-str 和 with-out-str 而不是使用 read-string 和 pr-str 有什么原因吗?
  • 并非如此。不记得我为什么这样写了。
  • 什么时候将其作为普通映射而不是结构映射来读取是个问题?我还没有遇到过不能互换的地方。但是,在这种情况下(根据需要进行概括),您可以在阅读时将每条记录合并到一个空书签中。
【解决方案2】:

使用吐痰和啜饮(示例取自http://www.nofluffjuststuff.com/blog/stuart_halloway/2008/09/pcl__clojure_chapter_3_1)。这种技术通常称为序列化。

(defn save-db [db filename]
  (spit 
   filename 
   (with-out-str (pr db))))

(defn load-db [filename] 
  (with-in-str (slurp filename)
    (read)))

(之前的打印错误在原代码中,我傻了没有检查。谢谢)

【讨论】:

  • (def x (struct bookmark "news.ycombinator.com" "News" "Tech News"));不处理“引号中的东西”
  • 他的例子有一个用引号引起来的名字。当我尝试重新加载数据时它不起作用 (save-db x "url-db.txt") ... (def y (load-db "url-db.txt"))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多