Hi, Clojurists! I'm writing some clojure in these days, and I stumbled upon an error that I'm unable to easily understand. My goal is to asynchronously process a 2D vector in order to solve a parametric version of the 8 chess queens problem (where the parameters are: the board's dimensions and the chess pieces to be put on the board). My solution mainly consists in two functions: the worker and the boss. The worker takes in input a board (2d array) and yields a collection of boards that contain another chess piece placed in a certain way. This means that I: > take all of the free squares from the board > try to place the chesspiece on every one of them > if I succeed (do not hit other pieces) - it goes to the output.
Until I use the version without the transients - it appears to be working. But I wanted to optimize my code, because the last time I solved it using recursive pmap - when I gave it an output that's a bit larger - it went into a bats**t crazy heap overflow. So I tried to use a transient collection. And here my problems began. When I try to execute this code it dies after just a couple of moves processed, giving me a nullpointer on the row where conj! is situated: NullPointerException clojure.core/conj! (core.clj:3257) What a hellish issue may it be? Clojure is not helping - its error messages are always cryptic, and really hard to understand. Here is my code. It's not complete though - some functions are omitted, for the sake of brevity. Please, help me to understand what am I missing here... Thank you. (def fw (agent {})) (defn worker [subj] (let [{brd :board pwns :pawns} subj nxt (get-next-pawn pwns)] (when (map? subj) (when (and brd pwns) (into #{} (persistent! (reduce #(when (not (keyword? %2)) (conj! %1 (if nxt {:board %2 :pawns (update pwns nxt dec)} brd))) (transient []) (map #(place nxt (first %) (last %) brd) (get-free-squares brd))))))))) (defn boss [] (send fw #(into {} %2) {:complete 0 :coll #{{:board (blank-board 4 4) :pawns {:rook 1 :knight 3 :bishop 2 }}}}) (loop [] (await fw) @fw (let [{done :complete col :coll} @fw] (if (= done (count col)) col (do (send-off fw #(identity {:complete (+ (:complete %1) (count (filter vector? %2))) :coll (into (:coll %1) %2)}) (reduce #(into %1 %2) #{} (pmap #(worker %) col))) (recur)))))) -- 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.