Generally when you want to return a set or a map or other 'single value' that isn't a seq from a 'repeated' generalized operation on a seq, using reduce is more idiomatic/straightforward than loop/recur, and for always returns a seq (not a set or map).

(reduce conj #{} (for [i (range 10) j (range 10)] [i j]))

note that (for ..) here is only used to produce a seq containing all the values to compile into the single result set. Or, for example:

This is not correct. From the docs for transients: " Note in particular that transients are not designed to be bashed in-place. You must capture and use the return value in the next call. In this way, they support the same code structure as the functional persistent code they replace".
–
JonasSep 30 '11 at 6:32