# Pass interpolating string to macro

**URL:** <https://discourse.julialang.org/t/pass-interpolating-string-to-macro/13876>\
**Category:** New to Julia\
**Tags:** macros, string-interpolation\
**Created:** [August 22, 2018, 9:50am UTC](https://discourse.julialang.org/t/pass-interpolating-string-to-macro/13876 "2018-08-22T09:50:39Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![ulysses](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ulysses/32/665_2.png) [@ulysses](https://discourse.julialang.org/u/ulysses)\
**Post date:** [August 22, 2018, 9:50am UTC](https://discourse.julialang.org/t/pass-interpolating-string-to-macro/13876/1 "2018-08-22T09:50:39Z")

</div>

I’m trying to define basic macro but fail:

```julia
macro mydebug(s)
  :(println($s))
end

function main()
  i = 42
  @mydebug("$(i)")
end

```

This one yield:

```julia
UndefVarError: i not defined

```

Is it not possible to pass interpolating strings to macros?

---

<div class="post-metadata">

**Author:** ![mauro3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mauro3/32/292_2.png) [@mauro3](https://discourse.julialang.org/u/mauro3)\
**Post date:** [August 22, 2018, 9:57am UTC](https://discourse.julialang.org/t/pass-interpolating-string-to-macro/13876/2 "2018-08-22T09:57:22Z")

</div>

You need to escape it:

```julia
macro mydebug(s)
         :(println($(esc(s))))
end 

```

I’m not sure why though.

---

<div class="post-metadata">

**Author:** ![yha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yha/32/3502_2.png) [@yha](https://discourse.julialang.org/u/yha)\
**Post date:** [August 22, 2018, 3:39pm UTC](https://discourse.julialang.org/t/pass-interpolating-string-to-macro/13876/3 "2018-08-22T15:39:57Z")

</div>

This isn’t related to string interpolation. You get the same error with

```julia
macro mydebug(s)
  :(println($s))
end
function main()
  i = 42
  @mydebug i 
end
main()

```

because

```julia
> @macroexpand @mydebug i
:((Main.println)(Main.i))

```

By default, the expression returned from a macro is modified to make sure global variables are interpreted in the macro’s scope (in the case, `Main`). `esc` overrides this to leave the expression as is. There’s more details in the docs under [Hygiene](https://docs.julialang.org/en/stable/manual/metaprogramming/#Hygiene-1).
