# Escaping in nested expr

**URL:** <https://discourse.julialang.org/t/escaping-in-nested-expr/6481>\
**Category:** General Usage\
**Created:** [October 16, 2017, 6:02pm UTC](https://discourse.julialang.org/t/escaping-in-nested-expr/6481 "2017-10-16T18:02:44Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![ssfrr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ssfrr/32/3736_2.png) [@ssfrr](https://discourse.julialang.org/u/ssfrr)\
**Post date:** [October 16, 2017, 6:02pm UTC](https://discourse.julialang.org/t/escaping-in-nested-expr/6481/1 "2017-10-16T18:02:44Z")

</div>

I’m trying to write a simple macro to enable/disable color output within a block (for running tests that capture and compare output)

This is what I have so far, but I can’t figure out the right escaping for `prev_color` at the end to restore the original color. I need it to refer to the `prev_color` defined inside the `quote` block.

```julia
macro color_output(enabled, block)
    quote
        prev_color = Base.have_color
        eval(Base, :(have_color = $$enabled))
        $(esc(block))
        eval(Base, :(have_color = $prev_color))
    end
end

```

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [October 16, 2017, 6:14pm UTC](https://discourse.julialang.org/t/escaping-in-nested-expr/6481/2 "2017-10-16T18:14:59Z")

</div>

Seems like a bug to me. In the mean time, you can always use `Expr(:(=), :have_color, prev_color)`.

---

<div class="post-metadata">

**Author:** ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)\
**Post date:** [October 16, 2017, 6:16pm UTC](https://discourse.julialang.org/t/escaping-in-nested-expr/6481/3 "2017-10-16T18:16:01Z")

</div>

Alternatively, you can `esc()` everything and handle the hygiene issue yourself:

```julia
macro color_output(enabled, block)
    p = gensym()
    esc(quote
        $p = Base.have_color
        eval(Base, :(have_color = $$enabled))
        $block
        eval(Base, :(have_color = $$p))
    end)
end

```

---

<div class="post-metadata">

**Author:** ![ssfrr](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ssfrr/32/3736_2.png) [@ssfrr](https://discourse.julialang.org/u/ssfrr)\
**Post date:** [October 16, 2017, 7:39pm UTC](https://discourse.julialang.org/t/escaping-in-nested-expr/6481/4 "2017-10-16T19:39:38Z")

</div>

Thanks for the ideas. It’s nice that I wasn’t just being dense. 🙂

It appears this is [issue #17558](https://github.com/JuliaLang/julia/issues/17588).
