# Why does with-meta realize lazy sequences?

**URL:** https://clojureverse.org/t/why-does-with-meta-realize-lazy-sequences/6664
**Category:** General Questions
**Created:** [October 11, 2020, 9:43am UTC](https://clojureverse.org/t/why-does-with-meta-realize-lazy-sequences/6664 "2020-10-11T09:43:29Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![daslu](https://clojureverse.org/user_avatar/clojureverse.org/daslu/32/4173_2.png) [@daslu](https://clojureverse.org/u/daslu)
#### Post date: [October 11, 2020, 9:43am UTC](https://clojureverse.org/t/why-does-with-meta-realize-lazy-sequences/6664/1 "2020-10-11T09:43:29Z")

</div>

```auto
$ clj
Clojure 1.10.1
(-> (map #(do (println %)
              (* 10 %))
         (range 9))
    (with-meta {:some-metadata "some-metadata"})
    meta)
0
1
2
3
4
5
6
7
8
{:some-metadata "some-metadata"}

```

---

<div class="post-metadata">

### Author: ![zelark](https://clojureverse.org/user_avatar/clojureverse.org/zelark/32/2902_2.png) [@zelark](https://clojureverse.org/u/zelark)
#### Post date: [October 11, 2020, 11:21am UTC](https://clojureverse.org/t/why-does-with-meta-realize-lazy-sequences/6664/2 "2020-10-11T11:21:09Z")

</div>

It’s a common Clojure gotcha if you don’t know about chunked sequences. `(range 10)` and `(vector 1 2 3 4 5)` are chunked sequences, but `(range)` and `(list 1 2 3 4 5)` are not. You can check it with `chunked-seq?` predicate.

Chunking means to be processed by 32-length chunks. Thus when you do `(first (map str (range)))` first 32 items of the lazy-seq would be realized.

When you invoke `with-meta` on a lazy-seq, `seq` will be invoked on the original sequence. Therefore either the first element or 32 first elements will be realized depending on type of the sequence.

Back to the original example, if you pass in a list instead of LongRange, you will see only the first element printed.

---

<div class="post-metadata">

### Author: ![BaptisteDupuch](https://clojureverse.org/user_avatar/clojureverse.org/baptistedupuch/32/898_2.png) [@BaptisteDupuch](https://clojureverse.org/u/BaptisteDupuch)
#### Post date: [October 11, 2020, 11:45am UTC](https://clojureverse.org/t/why-does-with-meta-realize-lazy-sequences/6664/3 "2020-10-11T11:45:13Z")

</div>

+1 for @zelark !  
You can double check the `CHUNK_SIZE` in `clojure.lang.Range.java`.  
Furthermore, just try this and you’ll see that it stops at 31

```auto
(-> (map #(do (println %)
                    (* 10 %))
               (range 33))
          (with-meta {:some-metadata "some-metadata"})
          meta)

```

---

<div class="post-metadata">

### Author: ![daslu](https://clojureverse.org/user_avatar/clojureverse.org/daslu/32/4173_2.png) [@daslu](https://clojureverse.org/u/daslu)
#### Post date: [October 11, 2020, 12:06pm UTC](https://clojureverse.org/t/why-does-with-meta-realize-lazy-sequences/6664/4 "2020-10-11T12:06:38Z")

</div>

Thank you so much @zelark @BaptisteDupuch!  
This makes sense now : ).

---

<div class="post-metadata">

### Author: ![system](https://clojureverse.org/uploads/default/original/2X/5/51079bf9e4b7d9466242c06cf1e43b9f8bd6da14.png) [@system](https://clojureverse.org/u/system)
#### Post date: [April 12, 2021, 12:06am UTC](https://clojureverse.org/t/why-does-with-meta-realize-lazy-sequences/6664/5 "2021-04-12T00:06:43Z")

</div>

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