2012-01-28 4 views

答えて

7

非怠惰あなたがそうのようなdoallを使用することができますに怠惰なシーケンスを変換するには:

(use 'clojure.java.io) 

(defn get-lines [fname] 
    (with-open [r (reader fname)] 
    (doall (line-seq r)))) 
2

line-seqを使用できます。簡単な例:

(ns your.project 
    (:require [clojure.java.io :as io])) 

(defn count-lines [filename] 
    (with-open [rdr (io/reader filename)] 
    (count (line-seq rdr)))) 

line-seqlazyであること。あなたはの読者が閉じられた後にシーケンスを消費しないように注意する必要があります。以下は動作しません。

(def lines (with-open [rdr (io/reader "some-file")] 
      (line-seq rdr))) 

(println (first lines)) 

countは怠け者ではありませんので、最初の例は動作します。

あなたが線で(副作用で)何かをしたい場合は、おそらくdoseqが最も有用見つけることができます:

;; copy every "short" line in file 
(with-open [rdr (io/reader from) 
      wrt (io/writer to)] 
    (binding [*out* wrt] 
    (doseq [line (line-seq rdr) :when (< (count line) 10)] 
     (println line)))) 
+0

:doallは、私が探していたキーでした。私は、ファイルをクローズした後にそのまま/使用可能だったリストが必要でした。 – ftravers

10

代替実装:

(require ['clojure.string :as 'str]) 

(defn get-lines [file] 
    (str/split-lines (slurp file))) 

この関数は、seqの代わりに結果のベクトルを返します。

1.3を使用していない場合は、代わりにclojure.contrib.stringが必要です。

関連する問題