Re: Newbie: adding items to a global vector in doseq
phi...@free.fr writes: > I have read up on atoms and used swap! to set the urls2 vector atom in > my code. Thanks. > > One problem remains though: I can't retrieve the atom vector's items > > *(nth urls 10)* > > throws the following exception > > java.lang.UnsupportedOperationException: nth not supported on this > type: Atom To access the current value of an atom, you need to dereference it: (nth @urls 10) Bye, Tassilo -- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: Newbie: adding items to a global vector in doseq
Thomas is absolutely right, Philippe. Things also get easier if you avoid, or defer side effects, and first focus on pure functions. So, for example at the REPL, you might first try processing a literal sequence of lines, repeatedly adjusting the processing code, tweaking the regex, until you get it right: (mapv #(re-find #"\w+\.\w+" %) ["abc def.g" "apple.com ibm.com foo"]) ;=> ["apple.com" "ibm.com"] You could turn the above into a pure function that works on a sequence of lines: (defn lines->urls [lines] (mapv #(re-find #"\w+\.\w+" %) lines)) You could then define your file reading code in terms of that pure function: (defn readf [file] (with-open [r (clojure.java.io/reader file)] (lines->urls (line-seq r -- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: Newbie: adding items to a global vector in doseq
Hey, it's not how you'd usually do things in Clojure and I'd consider the use of an atom in this place as "wrong". I was struggling with Clojure in the beginning too and my code looked pretty much like yours, but the faster you get into the Clojure mindset the easier it will be. This might be hard to understand at first but if you wrap your head arround whats happening you are halfway there to understanding Clojure: (defn readf [file] (with-open [r (clojure.java.io/reader file)] (->> (line-seq r) (map #(re-find #"\w+\.\w+" %)) (into [] (defn -main [] (let [urls (readf fich)] (println urls))) Try to use atoms for what they are meant (multi-threaded, concurrent code), not to emulate mutable local state. HTH, /thomas On Thursday, August 14, 2014 8:33:53 PM UTC+2, phi...@free.fr wrote: > > Just solved the problem by prepending at at-sign, in both cases: > > ( > > > *nth @urls 10)(doseq [x @urls] (println x))* > > > > Le jeudi 14 août 2014 18:05:25 UTC+2, phi...@free.fr a écrit : >> >> >> Hello, >> >> I am trying to add URLs contained in a text file (eg. apple.com, >> ibm.com...), to a global vector called url2, but to no avail, the vector >> remains empty. >> >> Any suggestions would be greatly appreciated. >> >> Many thanks. >> >> Philippe >> >> >> (def fich "data.txt") >>> >>> (def urls2 (vec nil)) >>> >>> (defn readf [file] >>> (let [x (vec nil)] >>> (with-open [r (clojure.java.io/reader file)] >>> (doseq [line (line-seq r)] >>> (conj urls2 (re-find #"\w+\.\w+" line)) >>> >>> >>> (defn -main [] >>> (do >>> (readf fich) >>> (println urls2))) >>> >> -- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: Newbie: adding items to a global vector in doseq
Just solved the problem by prepending at at-sign, in both cases: ( *nth @urls 10)(doseq [x @urls] (println x))* Le jeudi 14 août 2014 18:05:25 UTC+2, phi...@free.fr a écrit : > > > Hello, > > I am trying to add URLs contained in a text file (eg. apple.com, > ibm.com...), to a global vector called url2, but to no avail, the vector > remains empty. > > Any suggestions would be greatly appreciated. > > Many thanks. > > Philippe > > > (def fich "data.txt") >> >> (def urls2 (vec nil)) >> >> (defn readf [file] >> (let [x (vec nil)] >> (with-open [r (clojure.java.io/reader file)] >> (doseq [line (line-seq r)] >> (conj urls2 (re-find #"\w+\.\w+" line)) >> >> >> (defn -main [] >> (do >> (readf fich) >> (println urls2))) >> > -- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: Newbie: adding items to a global vector in doseq
Hi Mike, I have read up on atoms and used swap! to set the urls2 vector atom in my code. Thanks. One problem remains though: I can't retrieve the atom vector's items *(nth urls 10)* throws the following exception java.lang.UnsupportedOperationException: nth not supported on this type: Atom and *(doseq [x urls](println x* java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Atom Philippe Philippe Le jeudi 14 août 2014 18:49:20 UTC+2, Mike Fikes a écrit : > > Read up on atoms. The results of your conj call are being discarded. > > For example, check out the behavior of this: > > (def urls2 (atom [])) > (swap! urls2 conj "http://foo.bar";) > > -- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.