# Macro that defines function

**URL:** <https://discourse.julialang.org/t/macro-that-defines-function/42969>\
**Category:** General Usage\
**Tags:** metaprogramming\
**Created:** [July 13, 2020, 4:56am UTC](https://discourse.julialang.org/t/macro-that-defines-function/42969 "2020-07-13T04:56:35Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [July 13, 2020, 4:56am UTC](https://discourse.julialang.org/t/macro-that-defines-function/42969/1 "2020-07-13T04:56:35Z")

</div>

This doesn’t work. What’s the reason why I can’t define a function as expanded from a macro? Or did I do something wrong?

```julia
module C  
    macro makefunc(ex)
        return quote
            wat() = $(esc(ex))
        end
    end
    @makefunc(123)
end
using .C
C.wat() # ERROR: UndefVarError: wat not defined

```

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [July 13, 2020, 5:34am UTC](https://discourse.julialang.org/t/macro-that-defines-function/42969/2 "2020-07-13T05:34:12Z")

</div>

It works:

```julia
julia> macro makefunc(ex)
           return quote
               wat() = $(esc(ex))
           end
       end
@makefunc (macro with 1 method)

julia> @makefunc(123)
#19#wat (generic function with 1 method)

julia> var"#19#wat"()
123

```

But you probably didn’t want to name it `var"#19#wat"`. You could escape the entire expression instead of just `ex`.

---

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [July 13, 2020, 5:48am UTC](https://discourse.julialang.org/t/macro-that-defines-function/42969/3 "2020-07-13T05:48:53Z")

</div>

Ah, right! This works. Thanks.

```julia
module C  
    macro makefunc(ex)
        return esc(quote
            wat() = $ex
        end)
    end
    @makefunc(123)
end
using .C
C.wat() # 123

```
