Clojure 文件中的行集合

Clojure 文件中的行集合,clojure,Clojure,这应该是一个简单的问题,但我已经花了几个小时,仍然不明白如何在Clojure中正确使用集合。我试图读取一个文件并将每一行存储在一个集合中。 这是到目前为止我的代码 (def dictionary #{}) ;(conj dictionary "hi") (defn readDictionary [] (doseq [line (clojure.string/split-lines (slurp "C:\\Working\\Other\\dictionary.txt

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

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

(conj dictionary line)
。。。计算为
dictionary
,添加了
line
,使
dictionary
(和
line
)保持不变。因此,
doseq
生成一系列集合,每个集合包含一行

电话

(readDictionary)
。。。计算此单成员集序列,然后丢弃它,因为它未绑定到任何对象。因此,调用没有净影响

我想你想要这样的东西(未经测试):


在Clojure中,您必须习惯于使用在不可变/持久数据结构上运行的纯(无副作用)函数。

将文件中的行读入集合

(with-open [rdr (clojure.java.io/reader "C:\\Working\\Other\\dictionary.txt")]
   (set (line-seq rdr)))

谢谢这是一个非常有用的解释。有关于函数式编程的入门教程吗?我很难知道要搜索什么。我从一个问答式开始——用Scheme方言介绍递归和列表的基础知识。至于Clojure:允许您在浏览器中玩REPL;提供了一个从初级到困难的问题阶梯(还有一些要做…grrrrrr)。官方文件中有一页提及这些和其他内容。享受吧@qzcx。。。当你通过这些努力,你会明白为什么比我们的更好。
(with-open [rdr (clojure.java.io/reader "C:\\Working\\Other\\dictionary.txt")]
   (set (line-seq rdr)))