Unless prevented by outside considerations, it might also be cleaner/simpler to copy all inputs from Java -> Clojure, do all the algorithm work in Clojure, then copy all outputs back from Clojure -> Java. I'm looking specifically at `java-memory-map`, but would also replace native java stuff like `java.util.HashMap` with Clojure versions whenever possible. Again, the goal is to avoid clashes in the hidden assumptions of the two models. Alan
On Mon, Apr 24, 2017 at 1:05 PM, Alan Thompson <clooj...@gmail.com> wrote: > 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.