Your code works.
This form:
(doall (map #(nums %) (repeat 20)))
will generate an infinite amount of (nums 20) and never return. You can use dorun
instead, to drop the generated (nums 20)
and not keep them in memory. However, it will not return because (repeat 20)
generates an infinite lazy seq.
Slightly more readable version of headless
(defn headless [s]
(let [a (atom s)]
(fn
([] (let [s @a]
(swap! a rest)
(first s))
([n] (let [s @a]
(swap! a (partial drop n))
(take n s)))))))