Clojure 1.3:
user> (require '[clojure.java [io :as io]])
nil
user> (line-seq (io/reader "foo.txt"))
("foo" "bar" "baz")
user> (into #{} (line-seq (io/reader "foo.txt")))
#{"foo" "bar" "baz"}
line-seq
дает вам ленивую последовательность, где каждый элемент в последовательности является строкой в файле.
into
сваливает все это в набор. Чтобы сделать то, что вы пытались сделать (добавить каждый элемент один за другим в набор), вместо doseq
и ссылок, вы можете сделать:
user> (reduce conj #{} (line-seq (io/reader "foo.txt")))
#{"foo" "bar" "baz"}
Обратите внимание, что Unix comm
сравнивает два отсортированных файла, что, вероятно, является более эффективным способом сравнения файлов, чем пересечение множеств.
Редактировать: Дейв Рэй прав, чтобы избежать утечки открытых файловых дескрипторов, лучше сделать это:
user> (with-open [f (io/reader "foo.txt")]
(into #{} (line-seq f)))
#{"foo" "bar" "baz"}