Разве «concat» ломает лень «line-seq»? - PullRequest
1 голос
/ 27 ноября 2010

Следующий код заставляет line-seq прочитать 4 строки из file.Это какой-то механизм буферизации?Мне нужно использовать lazy-cat здесь?Если так, как я могу apply макрос в последовательность, как если бы это были аргументы с переменным числом аргументов?

(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

1 Ответ

3 голосов
/ 27 ноября 2010

Часть того, что вы видите, связана с apply, так как для этого потребуется реализовать столько аргументов, сколько необходимо для определения функции. 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
...