# Trouble with macro expression escaping

**URL:** https://discourse.julialang.org/t/trouble-with-macro-expression-escaping/52312
**Category:** General Usage
**Tags:** metaprogramming
**Created:** [December 24, 2020, 2:10am UTC](https://discourse.julialang.org/t/trouble-with-macro-expression-escaping/52312 "2020-12-24T02:10:02Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![Volker\_Weissmann](https://avatars.discourse-cdn.com/v4/letter/v/c2a13f/32.png) [@Volker\_Weissmann](https://discourse.julialang.org/u/Volker_Weissmann)
#### Post date: [December 24, 2020, 2:10am UTC](https://discourse.julialang.org/t/trouble-with-macro-expression-escaping/52312/1 "2020-12-24T02:10:03Z")

</div>

This code:

```julia
macro mymacro(ast)
    println("ast outside = ", ast, "---\n")
    :(function generated()
        println("ast inside = ", $ast, "---\n")
    end
    )
end

@mymacro function func()
    return 123
end

generated()

```

outputs:

> ast outside = function func()  
> #= /home/volker/Sync/DatenVolker/UNI/Masterarbeit/src/juliatest.jl:23 =#  
> #= /home/volker/Sync/DatenVolker/UNI/Masterarbeit/src/juliatest.jl:24 =#  
> return 123  
> end—
> 
> ast inside = #343#func—

How can I make it output

> ast outside = function func()  
> #= /home/volker/Sync/DatenVolker/UNI/Masterarbeit/src/juliatest.jl:23 =#  
> #= /home/volker/Sync/DatenVolker/UNI/Masterarbeit/src/juliatest.jl:24 =#  
> return 123  
> end—
> 
> ast inside = function func()  
> #= /home/volker/Sync/DatenVolker/UNI/Masterarbeit/src/juliatest.jl:23 =#  
> #= /home/volker/Sync/DatenVolker/UNI/Masterarbeit/src/juliatest.jl:24 =#  
> return 123  
> end—

---

<div class="post-metadata">

### Author: ![tomaklutfu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomaklutfu/32/2411_2.png) [@tomaklutfu](https://discourse.julialang.org/u/tomaklutfu)
#### Post date: [December 24, 2020, 4:53am UTC](https://discourse.julialang.org/t/trouble-with-macro-expression-escaping/52312/2 "2020-12-24T04:53:17Z")

</div>

> [@Volker\_Weissmann](#):
>
> #=  
> home/volker/Sync/DatenVolker/UNI/Masterarbeit/src/fuckjulia.jl:23 =#

Ok. That much furious with julia but care to ask. I would love to answer but you can find answer in the [documentation](https://docs.julialang.org/en/v1/manual/metaprogramming/#Hygiene).

---

<div class="post-metadata">

### Author: ![Volker\_Weissmann](https://avatars.discourse-cdn.com/v4/letter/v/c2a13f/32.png) [@Volker\_Weissmann](https://discourse.julialang.org/u/Volker_Weissmann)
#### Post date: [December 24, 2020, 4:13pm UTC](https://discourse.julialang.org/t/trouble-with-macro-expression-escaping/52312/3 "2020-12-24T16:13:03Z")

</div>

The documentation did not help me, but this code does exactly what I want:

```julia
struct AstWrapper
    inner::Expr
end

macro mymacro(ast)
    println("ast outside = ", ast, "---\n")
    wast = AstWrapper(ast)
    :(function generated()
        println("ast inside = ", $wast.inner, "---\n")
    end
    )
end

@mymacro function func()
    return 123
end

generated()

```

---

<div class="post-metadata">

### Author: ![pfitzseb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pfitzseb/32/45566_2.png) [@pfitzseb](https://discourse.julialang.org/u/pfitzseb)
#### Post date: [December 24, 2020, 4:32pm UTC](https://discourse.julialang.org/t/trouble-with-macro-expression-escaping/52312/4 "2020-12-24T16:32:35Z")

</div>

I think the canonical solution to this is to use a [`QuoteNode` or `Meta.quot`](https://docs.julialang.org/en/v1/manual/metaprogramming/#man-quote-node):

```julia
macro mymacro(ast)
    println("ast outside = ", ast, "---\n")
    :(function generated()
        println("ast inside = ", $(QuoteNode(ast)), "---\n")
    end
    )
end

```
