(def sid-batch 10)
(def sid-pool (atom {:cnt 0
:sids '()}))
(defn get-sid []
(first (:sids (swap! sid-pool
(fn [{:keys [cnt sids]}]
(if-let [sids (next sids)]
{:cnt cnt :sids sids}
{:sids (range cnt (+ sid-batch cnt))
:cnt (+ cnt sid-batch)}))))))
Как я уже сказал в своем комментарии, я думаю, что у вас есть правильная идея "злоупотреблять полем в sid-pool". За исключением того, что вам не нужно поле, просто вызовите (comp sids) возвращаемое значение из swap!
Я удалил значение inc в вызове range, потому что генератор пропустил кратные 10.
и вернуть sid в пул:
(defn return-sid [sid]
(swap! sid-pool (fn [{:keys [cnt [_ & ids]]}]
{:cnt cnt
:sids (list* _ sid ids)})))