Re: Newbie: adding items to a global vector in doseq

2014-08-14 Thread Tassilo Horn
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

2014-08-14 Thread Mike Fikes
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

2014-08-14 Thread Thomas Heller
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

2014-08-14 Thread phiroc
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

2014-08-14 Thread phiroc
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.