:while
- это тест на короткое замыкание в выражениях for
. Элементы списка будут создаваться до тех пор, пока в первый раз он не встретит неудачный тест.
В вашем случае
(for [<code omitted> :while (not (= 12 (+ a b c)))] (list a b c))
перестанет генерировать элементы, как только найдет триплет, суммирующий до 12.
Одна проблема, однако, это не делает то, что вы ожидаете. Сам триплет не был бы частью результата, поскольку он не прошел тест.
Понимание списка может быть не лучшим решением, если вы ищете только один соответствующий результат. Почему бы просто не использовать цикл?
(loop [xs (for [a (range 1 100)
b (range 1 100)] [a, b])]
(when (seq xs)
(let [[a, b] (first xs)
c (Math/sqrt (+ (Math/pow (int a) 2)
(Math/pow (int b) 2)))]
(if (not (= 12 (+ a b c)))
(recur (next xs))
(list a b c)))))