More optimsation ideas:

> (defn next-level [b dir]
>
>   (r/map #(Move->Board. % (core/try-move %))
>              (core/team-moves @curr-game b dir))) ;;curr-game is a promise

> (definline team-moves
>      [game b dir]
> `(let [team# (gather-team ~b ~dir)
>        tmvs# (r/mapcat (fn [p#] (r/map #(dest->Move ~game p# %) (getMoves
> p#))) team#)]
>  (into [] tmvs#)) )

You should return tmvs# and not (into [] ...).
The beauty of reducers is that they are composable without putting
results in intermediate sequence.
So, as tmvs# is going to be passed to another reducer transformer, you
don't need to
convert it to a seq.


> (definline gather-team "Returns all the pieces with same direction dir on
> this board b."
> [b dir]
> `(into [] (r/filter #(= ~dir (:direction %)) ~b))) ;all the team-mates (with
> same direction)

Same here, remove the (into []).
(Less important, you have only two directions, so you can compute the
closures for the two directions in advance
and use direction to choose. But it won't be a dramatic improvement.
For example:
(def gather-team
  (let [closure-up   #(= :up (:direction %)))) ;; use the name of your
direction here
        closure-down #(= :down (:direction %))))]
 (fn  [b dir]
   (r/filter (if (=dir :up) closure-up closure-down) ~b))))
)


> (definline dest->Move "Helper fn for creating moves."
> [dm p dest]  `(Move. ~p (partial move ~dm) ~dest))
You might want to see if replacing (partial move dm)
by  #(move dm %1 %2) helps a bit.
I doubt it won't change much though.

> (defn move
> "The function responsible for moving Pieces. Each piece knows how to move
> itself. Returns the resulting board without making any state changes. "
> [game-map p coords]
> ;;{:pre [(satisfies? Piece p)]}  ;safety comes first
> ;;(if  (some #{coords} (:mappings game-map)) ;check that the position exists
> on the grid
> (let [newPiece (update-position p coords) ;the new piece as a result of
> moving
>       old-pos  (getListPosition p)
>       new-pos  (getListPosition newPiece)]   ;;piece is a record
> (-> @(:board-atom game-map) ;deref the appropriate board atom
Why do you need an atom here?

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

Reply via email to