2010-11-27 2 views
1

Le code suivant apparaît pour forcer line-seq à lire 4 lignes de file. Est-ce une sorte de mécanisme de tamponnage? Dois-je utiliser lazy-cat ici? Si oui, comment puis-je apply une macro à une séquence comme s'il s'agissait d'arguments variadiques?Est-ce que 'concat' brise la paresse de 'line-seq'?

(defn char-seq [rdr] 
    (let [coll (line-seq rdr)] 
    (apply concat (map (fn [x] (println \,) x) coll)))) 

(def tmp (char-seq (clojure.contrib.io/reader file))) 

;, 
;, 
;, 
;, 
#'user/tmp 

Répondre

3

Une partie de ce que vous voyez est dû à apply, car il devra réaliser autant args au besoin par la définition de la fonction. E.g .:

 
user=> (defn foo [& args] nil) 
#'user/foo 
user=> (def bar (apply foo (iterate #(let [i (inc %)] (println i) i) 0))) 
1 
#'user/bar 
user=> (defn foo [x & args] nil) 
#'user/foo 
user=> (def bar (apply foo (iterate #(let [i (inc %)] (println i) i) 0))) 
1 
2 
#'user/bar 
user=> (defn foo [x y & args] nil) 
#'user/foo 
user=> (def bar (apply foo (iterate #(let [i (inc %)] (println i) i) 0))) 
1 
2 
3 
#'user/bar