# Docstrings in macros

**URL:** <https://discourse.julialang.org/t/docstrings-in-macros/2659>\
**Category:** General Usage\
**Tags:** question\
**Created:** [March 14, 2017, 9:32am UTC](https://discourse.julialang.org/t/docstrings-in-macros/2659 "2017-03-14T09:32:24Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [March 14, 2017, 9:32am UTC](https://discourse.julialang.org/t/docstrings-in-macros/2659/1 "2017-03-14T09:32:24Z")

</div>

What’s the right way of defining docstrings in macros? Should I just use `@doc`? MWE:

```julia
macro define_singleton(docstring, typename, constant = Symbol(uppercase(string(typename))))
    quote
        @doc $docstring immutable $typename end
        @doc $docstring const $(esc(constant)) = $typename()
    end
end

```

When I remove `@doc`, it does not even parse.

---

<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:** [March 14, 2017, 10:39am UTC](https://discourse.julialang.org/t/docstrings-in-macros/2659/2 "2017-03-14T10:39:13Z")

</div>

Probably:

[http://docs.julialang.org/en/stable/manual/documentation/#macro-generated-code](http://docs.julialang.org/en/stable/manual/documentation/#macro-generated-code)

Or does that not work for your case?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [March 14, 2017, 10:53am UTC](https://discourse.julialang.org/t/docstrings-in-macros/2659/3 "2017-03-14T10:53:57Z")

</div>

I was not aware of this, thanks! The final macro is

```julia
using MacroTools

"""
Define a singleton type with the given name and supertype (specified
as `name <: supertype`), and a constant which defaults to the name in
uppercase.
"""
macro define_singleton(name_and_supertype, constant = nothing)
    @capture name_and_supertype name_ <: supertype_
    if constant == nothing
        constant = esc(Symbol(uppercase(string(name))))
    end
    quote
        Core.@ __doc__ immutable $name <: $supertype end
        Core.@ __doc__ const $(constant) = $name()
    end
end

```
