J'écris mon premier programme en Clojure.
J'utilise clojure.data.csv pour traiter un fichier csv. Mon fichier est potentiellement grand et je veux donc exploiter la paresse. Mon code MWE pour démontrer mon problème est montré ci-dessous.
Lorsque j'exécute la fonction load-data, j'obtiens "IOException Stream closed" et il est donc clair pour moi que le flux paresseux est fermé avant le point de consommation.
J'ai consulté la documentation relative au fichier data.csv ( https://github.com/clojure/data.csv ) et on peut voir qu'une façon d'empêcher la fermeture du flux avant sa consommation est de déplacer l'ouverture du flux dans la pile d'appels où le flux est consommé. D'après ce que je comprends, c'est ce que j'ai fait ci-dessous puisque (take 5) est dans les limites de with-open. Il est clair que j'ai une lacune conceptuelle. J'apprécie énormément toute aide !
(ns data-load.core
(:gen-class)
(:require [clojure.data.csv :as csv]
[clojure.java.io :as io]))
(defn load-data [from to]
(with-open [reader (io/reader from)
writer (io/writer to)]
(->> (csv/read-csv reader)
(take 5))))