Another possible approach. Key idea here is to use partition to create a sliding window over the lines, plus a sentinel value (I picked "") before the first line. Pretty sure I like partition over reduce for this particular example.
(ns examples.convert (:use [clojure.contrib.duck-streams :only (reader)]) (:use [clojure.contrib.str-utils :only (re-split)])) (defstruct line :lat :lon :name) (defn convert [file] (with-open [r (reader file)] (doseq [[l1 l2] (partition 2 1 (cons "" (line-seq r)))] (if (not= l1 l2) (println (apply struct line (re-split #"," l2))))))) > I am parsing a file and to compare the current line > with the previous line of the file. I am using line-seq > to go thru the file and I thought I would create a > ref to store the previous line. When I want to update > the previous line value I can't seem to do it. I've > never used refs before so I'm sure I'm doing something > very stupid. > > (defstruct line :lat :lon :name) > > (defn convert [file] > (let [prev-line (ref (struct line))] > (with-open [r (reader file)] > (doseq [l (line-seq r)] > (let [ps (split #"," l) > c-line (struct line (ps 0) (ps 1) (ps 2))] > (if (not= c-line @pre-line) > (do ; do stuff here then update pre-line > (dosync ref-set pre-line (apply struct line (vals c- > line))) > (println @pre-line)))))))) ; this prints out all > nils doesn't seem to work > > > > Sorry if this email is not formatted correctly. Something is wrong > with my browser > currently typing in a textarea. Thanks. > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---