Having not gone through your code in detail, I would suggest replacing `map` -> `mapv` to make it an eager operation so that state updates (i.e. ` next-states`) occur right away. The presence of laziness where it is not needed or expected (especially in Java interop code) can cause problems with the (implicit) assumptions of other code. Alan
On Sat, Apr 22, 2017 at 2:59 AM, Lucas Wiener <luwie...@gmail.com> wrote: > Hi all, > > I'm working on solving the problem http://adventofcode.com/2016/day/11 , > and ran into some weird behaviour. I have solved the actual problem, so > let's not focus on it. > > Here's my code: > > (defn compute3 > {:test (fn [] > (is= (compute3 (create-state "F4 . . . . . " > "F3 . . . LG . " > "F2 . HG . . . " > "F1 E . HM . LM ")) > 11))} > [state] > (let [done-simple-state (state->simple-state (construct-finished-state > state)) > inner-fn (fn [states steps java-memory-map] > (println "On step" steps) > (println "Number of states" (count states)) > (let [next-states (->> states > (map (fn [state] > (->> (get-next-states > state) > (filter (fn [s] > (nil? (.get java-memory-map (state->simple-state s)))))))) > (flatten))] > ;; (println (count next-states)) <- Uncomment this > line to change the behavior > (if (.get java-memory-map done-simple-state) > steps > (do (doseq [next-state next-states] > (.put java-memory-map (state->simple-state > next-state) steps)) > (recur next-states (inc steps) > java-memory-map)))))] > (inner-fn [state] 0 (java.util.HashMap.)))) > > When running this in the repl I get the following output: > > On step 0 > Number of states 1 > On step 1 > Number of states 1 > On step 2 > Number of states 3 > On step 3 > Number of states 11 > On step 4 > Number of states 14 > On step 5 > Number of states 22 > On step 6 > Number of states 37 > On step 7 > Number of states 48 > On step 8 > Number of states 35 > On step 9 > Number of states 22 > On step 10 > Number of states 17 > On step 11 > Number of states 7 > > However, if I uncomment the println statement I get the following output > in the REPL: > > On step 0 > Number of states 1 > 1 > On step 1 > Number of states 1 > 3 > On step 2 > Number of states 3 > 11 > On step 3 > Number of states 11 > 15 > On step 4 > Number of states 15 > 28 > On step 5 > Number of states 28 > 63 > On step 6 > Number of states 63 > 107 > On step 7 > Number of states 107 > 90 > On step 8 > Number of states 90 > 82 > On step 9 > Number of states 82 > 115 > On step 10 > Number of states 115 > 81 > On step 11 > Number of states 81 > 110 > > Please note that "On step 4" prints "Number of states 14" and "Number of > states 15" differently. > > Any thoughts? > > -- > 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.