# Finite lazy-seq - how to terminate?

Questions on lazy-seq.

I stumbled on below code from clojure essential reference book

(defn untangle [n xs]
(letfn [(step [xs]
(lazy-seq
(cons
(take-nth n xs)
(step (rest xs)))))]
(take n (step xs))))

(untangle 2 (interleave (range 3) (repeat 3 ".")))
;; ((0 1 2) ("." "." "."))

I understand if xs is an infinite sequence. It generates next element on demand.
But it’s a finite sequence. My question is how the lazy-seq knows when it terminates the step function.

Cheers,
sun

The lazy-seq is infinite, not finite–i.e. it doesn’t terminate the step function. the key is the (take n (step xs)), that’s why the output is finite. If you change it to (take 10 (step xs)) for example, you’ll get this output: ((0 1 2) ("." "." ".") (1 2) ("." ".") (2) (".") () () () ())

1 Like

hmmm, even if the input is finite, it can generatie infinite sequence.
thanks a lot.

Hello @sunjlee!

For future reference, if you paste your code like this into your editor, you get syntax highlighting, which makes it easier to read the code:

```clojure
(defn untangle [n xs]
(letfn [(step [xs]
(lazy-seq
(cons
(take-nth n xs)
(step (rest xs)))))]
(take n (step xs))))

(untangle 2 (interleave (range 3) (repeat 3 “.”)))
;; ((0 1 2) ("." “.” “.”))
```

That way, you can even keep your code indentation:

(defn untangle [n xs]
(letfn [(step [xs]
(lazy-seq
(cons
(take-nth n xs)
(step (rest xs)))))]
(take n (step xs))))

(untangle 2 (interleave (range 3) (repeat 3 “.”)))
;; ((0 1 2) ("." “.” “.”))

Thanks!

Teodor

1 Like

Three backtick?

2019년 7월 13일 (토) 오후 1:13, Teodor Heggelund via ClojureVerse notifications@clojureverse.org님이 작성:

Yup, triple backtick in before and after the code. And clojure after the first backtick.

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.