Hello. I've tried to translate nice Hilbert-curve-index calculating function to clojure (http://blog.notdot.net/2009/11/Damn-Cool-Algorithms- Spatial-indexing-with-Quadtrees-and-Hilbert-Curves).
I've got sth like that: (def hilbert-map { :a {[0 0] [0 :d], [0 1] [1 :a], [1 0] [3 :b], [1 1] [2 :a]} :b {[0 0] [2 :b], [0 1] [1 :b], [1 0] [3 :a], [1 1] [0 :c]} :c {[0 0] [2 :c], [0 1] [3 :d], [1 0] [1 :c], [1 1] [0 :b]} :d {[0 0] [0 :a], [0 1] [3 :c], [1 0] [1 :d], [1 1] [2 :d]} } ) (defn point-to-hilbert "Return index of point (x,y) on Hilbert curve defined on square (2^order)*(2^order). x,y should be in 0 .. (2^order)-1 result will be in 0 .. (2^(order*2))-1" [x y order] (let [step-inside (fn [x i] (if (== 0 (bit-and x (bit-shift-left 1 i))) 0 1)) step (fn [square i] ((hilbert-map square) [(step-inside x i) (step-inside y i)]))] (loop [ square :a, position 0, i (dec order)] (if (< i (int 0)) position (let [ v (step square i)] (recur (v 1), (-> position (bit-shift-left 2) (bit-or (v 0))), (dec i))))))) (time (dotimes [ _ (int 1000)] (point-to-hilbert (rand-int (int -1000)) (int 1) (int 16)))) I would like to somehow hide the global hilbert-map into my function, but I can't see how to do that. Is this possible? I know that I can just inert literal into my let, but that degrades performance, when function is called many times. I would like to have something like static local variable in C++, or just regular constant local variable in my function. Besides, if you see a way to improve my code, please, tell how. Greetings. -- 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