I'm studying clojure but not quite clear on the difference between the `:while`

and `:when`

test:

```
=> (for [x [1 2 3] y [1 2 3] :while (= (mod x y) 0)] [x y])
([1 1] [2 1] [2 2] [3 1])
=> (for [x [1 2 3] y [1 2 3] :when (= (mod x y) 0)] [x y])
([1 1] [2 1] [2 2] [3 1] [3 3])
```

Can anybody help by elaborating on them ?

`:when`

iterates over the bindings, but only evaluates the body of the loop when the condition is true. `:while`

iterates over the bindings and evaluates the body *until* the condition is false:

```
(for [x (range 20) :when (not= x 10)] x)
; =>(0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19)
(for [x (range 20) :while (not= x 10)] x)
; => (0 1 2 3 4 5 6 7 8 9)
```