doseq over atomic collection

2015-04-05 Thread Shahrdad Shadab
Hi folks

It may seem silly question but why when I doseq over a vector that is
wrapped in an atom and change the vector using swap! while I am inside
doseq, the doseq sets to the beginning of the vector intermittently:


(def a-data (atom [15 9 8 1 4 11 7 12 13 14 5 3 16 2 10 6]))

(defn switch-two-elements [the-vector] ... ) ;; swaping two elements in
given vector

(doseq [element @a-data]
  (println @a-data) (println element)
   (swap! a-data switch-two-elements))

[15 9 8 1 4 11 7 12 13 14 5 3 16 2 10 6]
15

[1 9 8 15 4 11 7 12 13 14 5 3 16 2 10 6]
9

[1 4 8 15 9 11 7 12 13 14 5 3 16 2 10 6]
8

[1 4 5 15 9 11 7 12 13 14 8 3 16 2 10 6]
1 == I expect this to be 15

I suspect the reason would be the same as the one behind not changing a
collection in java while iterating over it.

I appreciate any insight on this.

Thanks a lot
Best regards




-- 
Software Architect  Computer Scientist

-- 
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: doseq over atomic collection

2015-04-05 Thread James Reeves
Dereferencing an atom will give you the value of the atom at the time you
dereferenced it. So at the start of the doseq loop, you deref the atom and
get back an immutable vector of values. It's the same as writing:

(let [data @a-data]
  (doseq [element data]
...))

You dereference first, and then you iterate over that fixed sequence. The
value of a-data might change, but the dereferenced data does not.

- James

On 5 April 2015 at 18:00, Shahrdad Shadab shahrd...@gmail.com wrote:

 Hi folks

 It may seem silly question but why when I doseq over a vector that is
 wrapped in an atom and change the vector using swap! while I am inside
 doseq, the doseq sets to the beginning of the vector intermittently:


 (def a-data (atom [15 9 8 1 4 11 7 12 13 14 5 3 16 2 10 6]))

 (defn switch-two-elements [the-vector] ... ) ;; swaping two elements in
 given vector

 (doseq [element @a-data]
   (println @a-data) (println element)
(swap! a-data switch-two-elements))

 [15 9 8 1 4 11 7 12 13 14 5 3 16 2 10 6]
 15

 [1 9 8 15 4 11 7 12 13 14 5 3 16 2 10 6]
 9

 [1 4 8 15 9 11 7 12 13 14 5 3 16 2 10 6]
 8

 [1 4 5 15 9 11 7 12 13 14 8 3 16 2 10 6]
 1 == I expect this to be 15

 I suspect the reason would be the same as the one behind not changing a
 collection in java while iterating over it.

 I appreciate any insight on this.

 Thanks a lot
 Best regards




 --
 Software Architect  Computer Scientist

 --
 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.


-- 
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: doseq over atomic collection

2015-04-05 Thread Shahrdad Shadab
Thanks a lot James. It seems I completely missed the order of let and doseq.


On Sun, Apr 5, 2015 at 1:12 PM, James Reeves ja...@booleanknot.com wrote:

 Dereferencing an atom will give you the value of the atom at the time you
 dereferenced it. So at the start of the doseq loop, you deref the atom and
 get back an immutable vector of values. It's the same as writing:

 (let [data @a-data]
   (doseq [element data]
 ...))

 You dereference first, and then you iterate over that fixed sequence. The
 value of a-data might change, but the dereferenced data does not.

 - James

 On 5 April 2015 at 18:00, Shahrdad Shadab shahrd...@gmail.com wrote:

 Hi folks

 It may seem silly question but why when I doseq over a vector that is
 wrapped in an atom and change the vector using swap! while I am inside
 doseq, the doseq sets to the beginning of the vector intermittently:


 (def a-data (atom [15 9 8 1 4 11 7 12 13 14 5 3 16 2 10 6]))

 (defn switch-two-elements [the-vector] ... ) ;; swaping two elements in
 given vector

 (doseq [element @a-data]
   (println @a-data) (println element)
(swap! a-data switch-two-elements))

 [15 9 8 1 4 11 7 12 13 14 5 3 16 2 10 6]
 15

 [1 9 8 15 4 11 7 12 13 14 5 3 16 2 10 6]
 9

 [1 4 8 15 9 11 7 12 13 14 5 3 16 2 10 6]
 8

 [1 4 5 15 9 11 7 12 13 14 8 3 16 2 10 6]
 1 == I expect this to be 15

 I suspect the reason would be the same as the one behind not changing a
 collection in java while iterating over it.

 I appreciate any insight on this.

 Thanks a lot
 Best regards




 --
 Software Architect  Computer Scientist

 --
 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.


  --
 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.




-- 
Software Architect  Computer Scientist

-- 
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.