从文件中收集行

时间:2014-08-01 16:34:31

标签: clojure

这应该是一个简单的问题,但我花了几个小时,我仍然不明白如何在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编程非常熟悉,但函数式编程对我来说是新的。

2 个答案:

答案 0 :(得分:6)

问题不在于集合本身。问题是conj与大多数核心库一样,有副作用。所以表达式:

(conj dictionary line)

... 评估 dictionary并添加linedictionary(和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)))