这应该是一个简单的问题,但我花了几个小时,我仍然不明白如何在Clojure中正确使用套装。我尝试读取文件并将每行存储在一个集合中。 到目前为止,这是我的代码。
(def dictionary #{})
;(conj dictionary "hi")
(defn readDictionary []
(doseq [line (clojure.string/split-lines
(slurp "C:\\Working\\Other\\dictionary.txt"))]
(println line)
(conj dictionary line)))
(readDictionary)
(println dictionary)
我可以附加" hi"字符串到集合中,每行都在doseq中打印出来,但是当我打印出来时,该集合最终会变成空白。
我对OO编程非常熟悉,但函数式编程对我来说是新的。
答案 0 :(得分:6)
问题不在于集合本身。问题是conj
与大多数核心库一样,不有副作用。所以表达式:
(conj dictionary line)
... 评估 dictionary
并添加line
,dictionary
(和line
)保持不变。因此doseq
生成一系列集合,每个集合包含一行。
电话
(readDictionary)
...评估这个单成员集序列,然后丢弃它,因为它没有绑定任何东西。因此,该呼叫具有无净效果。
我想你想要这样的东西(未经测试):
(defn readDictionary [file-name]
(into #{} (clojure.string/split-lines (slurp file-name))))
(def dictionary (readDictionary "C:\\Working\\Other\\dictionary.txt"))
(doseq [line dictionary] (println line))
在Clojure中,你必须习惯使用在不可变/持久数据结构上运行的纯(无副作用)函数。
答案 1 :(得分:1)
从文件中读取行到
(with-open [rdr (clojure.java.io/reader "C:\\Working\\Other\\dictionary.txt")]
(set (line-seq rdr)))