Assuming you want to use showpos (which is arguably slower since you have to traverse the list each time):
(mac w/collect body
`(accum collect ,@body))
(def observe (x y r)
(w/collect:for i (- x r) (+ x r)
(for j (- y r) (+ y r)
(awhen (showpos i j)
(collect it)))))
If you want efficiency and still want to use list structures, you might want to skip 'showpos.
Good call. Not necessarily want to use showpos.. its main advantage right now is that it nicely returns nil when I try to read any out-of-bound position.
I guess without showpos I could grab the appropriate rows from world and discard the first X and last Y positions.
From here on I adapted the function to the one I really needed (do something if one of the 8 neighbours of posx, posy is X). Because of that requirement it seemed easier to just gather the row - 1 and row + 1 and the row, col - 1 and row, col + 1, and join those in a list. This is what it ended up as:
(if (find X (flat:map [join (errsafe (world _))] (list (- row 1) (+ row 1) (- col 1) (+ col 1))))
; do stuff
)