用于创建和存储对象的Clojure代码

时间:2013-08-13 14:35:05

标签: clojure

我想编写一个可以为“故事”创建结构的clojure程序。例如,我希望能够“添加故事”,这将创建一个包含字符和事件字段的新故事,而“add-char”会将具有属性字段的新字符添加到给定的故事中。

我希望能够创建并填写“故事”,然后能够退出并稍后返回以找到与我离开时相同状态的故事。我是否需要编写一个持续运行的程序?如何存储故事/事件/角色等数据,以便我以后可以回复它们?

1 个答案:

答案 0 :(得分:3)

在这个项目中获得Clojure生态系统优势的一种方法是将您的故事表示为地图:

{:title "Allice's adventures in Clojure Land"
 :characters []}

然后当它改变时将它写入文件,数据库,Amazon-s3-bucket,Dropbox等基本上任何会记住位的东西都会这样做,因为Clojure结构既可打印又可读所以序列化和解析是内置的。

然后添加一个字符看起来像:

(update-in story [:characters] conj {:name "Allice"})
{:title "Allice's adventures in Clojure Land", :characters [{:name "Allice"}]} 

然后将该字符串写入数据存储区以便以后检索。这背后的想法是从存储中分离数据,并更新流程,以便尽可能简化每个流程。

保存clojure核心数据结构的最简单(最熟悉的方法)是:

core> (spit "save.edn" (pr-str {:title "Allice's adventures in Clojure Land", 
                                :characters [{:name "Allice"}]})) 
nil
core> (read-string (slurp "save.edn"))
{:title "Allice's adventures in Clojure Land", :characters [{:name "Allice"}]} 

虽然这只适用于最简单的程序。在许多情况下,您将需要更复杂的东西,如数据库或对象存储(S3)。 Clojure的数据格式称为可扩展数据表示法或EDN,因此扩展名为.edn