Если вы посмотрите на след
(try
(sieve 200000)
(catch java.lang.StackOverflowError e
(.printStackTrace e)))
это выглядит так:
...
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4176.invoke(core.clj:103)
at clojure.core$filter__5033$fn__5035.invoke(core.clj:1751)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
...
Переполнение вызывает слишком много фильтров, а не цикл.
К сожалению, я не вижу очевидного решения для этого.