update a ref struct
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 -~--~~~~--~~--~--~---
Re: update a ref struct
I know you are asking about refs, but you might want to think about using reduce to walk the line-seq. the nature of reduce lets you have access to the line-seq, two lines at a time no need for a ref. On Mon, Nov 24, 2008 at 2:17 PM, Brian Doyle [EMAIL PROTECTED] wrote: 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. -- The Mafia way is that we pursue larger goals under the guise of personal relationships. Fisheye --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
Re: update a ref struct
Thanks Kevin, I will try using reduce instead. I would like to know what I'm doing wrong with updating the ref for future reference. Thanks. On Mon, Nov 24, 2008 at 3:23 PM, Kevin Downey [EMAIL PROTECTED] wrote: I know you are asking about refs, but you might want to think about using reduce to walk the line-seq. the nature of reduce lets you have access to the line-seq, two lines at a time no need for a ref. On Mon, Nov 24, 2008 at 2:17 PM, Brian Doyle [EMAIL PROTECTED] wrote: 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. -- The Mafia way is that we pursue larger goals under the guise of personal relationships. Fisheye --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
Re: update a ref struct
ref-set needs its one set of parens, and the last thing in the ref-set call needs to be a function either (fn [x] ...) or a symbol for a var that holds a function On Mon, Nov 24, 2008 at 2:30 PM, Brian Doyle [EMAIL PROTECTED] wrote: Thanks Kevin, I will try using reduce instead. I would like to know what I'm doing wrong with updating the ref for future reference. Thanks. On Mon, Nov 24, 2008 at 3:23 PM, Kevin Downey [EMAIL PROTECTED] wrote: I know you are asking about refs, but you might want to think about using reduce to walk the line-seq. the nature of reduce lets you have access to the line-seq, two lines at a time no need for a ref. On Mon, Nov 24, 2008 at 2:17 PM, Brian Doyle [EMAIL PROTECTED] wrote: 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. -- The Mafia way is that we pursue larger goals under the guise of personal relationships. Fisheye -- The Mafia way is that we pursue larger goals under the guise of personal relationships. Fisheye --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
Re: update a ref struct
On Mon, Nov 24, 2008 at 2:34 PM, Kevin Downey [EMAIL PROTECTED] wrote: ref-set needs its one set of parens, and the last thing in the ref-set call needs to be a function either (fn [x] ...) or a symbol for a var that holds a function I made a mistake here. I was thinking of alter, not ref-set. On Mon, Nov 24, 2008 at 2:30 PM, Brian Doyle [EMAIL PROTECTED] wrote: Thanks Kevin, I will try using reduce instead. I would like to know what I'm doing wrong with updating the ref for future reference. Thanks. On Mon, Nov 24, 2008 at 3:23 PM, Kevin Downey [EMAIL PROTECTED] wrote: I know you are asking about refs, but you might want to think about using reduce to walk the line-seq. the nature of reduce lets you have access to the line-seq, two lines at a time no need for a ref. On Mon, Nov 24, 2008 at 2:17 PM, Brian Doyle [EMAIL PROTECTED] wrote: 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. -- The Mafia way is that we pursue larger goals under the guise of personal relationships. Fisheye -- The Mafia way is that we pursue larger goals under the guise of personal relationships. Fisheye -- The Mafia way is that we pursue larger goals under the guise of personal relationships. Fisheye --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
Re: update a ref struct
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 -~--~~~~--~~--~--~---
Re: update a ref struct
Yep, that's just a typo in the email. Something was wrong with my browser and I couldn't just paste the code in :( On Mon, Nov 24, 2008 at 3:33 PM, Shawn Hoover [EMAIL PROTECTED]wrote: On Mon, Nov 24, 2008 at 5:17 PM, Brian Doyle [EMAIL PROTECTED]wrote: 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 Your let binds prev-line, while the code inside uses pre-line. Is that just a typo in your email, or is that the code you're running, too? Shawn --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---