# Adding documentation string in metaprogramming function definition eval loop

**URL:** <https://discourse.julialang.org/t/adding-documentation-string-in-metaprogramming-function-definition-eval-loop/34156>\
**Category:** General Usage\
**Tags:** question\
**Created:** [February 4, 2020, 10:35am UTC](https://discourse.julialang.org/t/adding-documentation-string-in-metaprogramming-function-definition-eval-loop/34156 "2020-02-04T10:35:22Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Datseris](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/datseris/32/13406_2.png) [@Datseris](https://discourse.julialang.org/u/Datseris)\
**Post date:** [February 4, 2020, 10:35am UTC](https://discourse.julialang.org/t/adding-documentation-string-in-metaprogramming-function-definition-eval-loop/34156/1 "2020-02-04T10:35:22Z")

</div>

I have this nice codeblock:

```julia
for (dim, Dim) in (("time", :Time), ("zonal", :Lon))
    @eval begin
        # """
        # $(dim)average(a::DimensionalArray, i=end)
        # Return the $(dim)-averaged `a` (average across dimension $Dim).
        # Do the time average from index `1` to `i` of that dimension.
        # """
        $(Symbol(dim, :average))(a::AbDimArray) = drop(mean, a, $(Dim))
        $(Symbol(dim, :average))(a::AbDimArray, i) = drop(mean, a[$(Dim)(1:i)], $(Dim))
        export $(Symbol(dim, :average))
    end
end

```

which works, and does exactly what it should: it defines 2 functions, `timeaverage` and `zonalaverage` that do what they are supposed to do.

Now what I"d like to do is make these functions have a documentation string! I’ve written the docstring as you can see (its commented out), but I find that it throws error that `dim` is not defined… How do I attach a docstring in a function I define in such a way? I could define the necessary string before the `@eval` block, but I don’t know how to attach it.

---

<div class="post-metadata">

**Author:** ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)\
**Post date:** [February 4, 2020, 10:43am UTC](https://discourse.julialang.org/t/adding-documentation-string-in-metaprogramming-function-definition-eval-loop/34156/2 "2020-02-04T10:43:16Z")

</div>

You need to interpolate twice; into the expression and into the string:

```julia
julia> for (dim, Dim) in (("time", :Time), ("zonal", :Lon))
           @eval begin
               """
                   $($(dim))average(a::DimensionalArray, i=end)
               Return the $($(dim))-averaged `a` (average across dimension $($(string(Dim)))).
               Do the time average from index `1` to `i` of that dimension.
               """
               $(Symbol(dim, :average))(a::Array) = drop(mean, a, $(Dim))
               $(Symbol(dim, :average))(a::Array, i) = drop(mean, a[$(Dim)(1:i)], $(Dim))
               export $(Symbol(dim, :average))
           end
       end

help?> timeaverage
search: timeaverage

  timeaverage(a::DimensionalArray, i=end)

  Return the time-averaged a (average across dimension Time). Do the time average from index 1 to i of that dimension.

```

Note also the `string(Dim)`, not sure why that is needed.

---

<div class="post-metadata">

**Author:** ![Datseris](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/datseris/32/13406_2.png) [@Datseris](https://discourse.julialang.org/u/Datseris)\
**Post date:** [February 4, 2020, 10:48am UTC](https://discourse.julialang.org/t/adding-documentation-string-in-metaprogramming-function-definition-eval-loop/34156/3 "2020-02-04T10:48:04Z")

</div>

For me the `string` was not necessary (and in fact made the printing worse, as it showed `across dimension string(DimensionalData.Dim))`. I guess the difference was that in my workspace `Time` is an existing struct?

---

<div class="post-metadata">

**Author:** ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)\
**Post date:** [February 4, 2020, 10:50am UTC](https://discourse.julialang.org/t/adding-documentation-string-in-metaprogramming-function-definition-eval-loop/34156/4 "2020-02-04T10:50:20Z")

</div>

Yea, that makes sense.
