On 29 May 2010 14:19, WoodHacker <[email protected]> wrote:
> I'm working on a simple imaging problem. I want to copy an array of
> pixels to an image buffer. That means that I have to deal both with
> an array and a matrix (x and y). As I go along my array, each time x
> reaches the end of a line in the matrix I have to set it back to zero
> and increment y.
>
> I can find no simple way to do this without getting a compile error.
> Can someone show me how to do this?
You could use loop/recur. The following code is closest in structure
to the pseudo code you supplied:
(loop [x 0, y 0, k 0]
(when (< k 256)
(write-buffer x y (value k))
(if (= x 16)
(recur 0 (inc y) (inc k))
(recur (inc x) y (inc k)))))
However, there are more concise methods of programming the same thing.
For instance, we don't need to bother incrementing x and y; we can
calculate them on the fly from k using modulus (mod) and quotient
(quot):
(loop [k 0]
(when (< k 256)
(write-buffer (mod k 16) (quot k 16) (value 16))
(recur (inc k))))
Now we just have a single loop with a single incrementing variable, k.
This is a common pattern, and there is a macro called "dotimes" in
clojure.core that implements that pattern:
(dotimes [k 256]
(write-buffer (mod k 16) (quot k 16) (value 16)))
- James
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en