The `eval` is going to do some really odd things there. If you're on a very recent 0.5 build you should probably see the following output after doing that
``` julia> for name in (:year, :month, :day, :hour, :minute, :second, :millisecond) func = eval(name) @doc """ $name(dt::TimeType) -> Int64 Return the $name of a `Date` or `DateTime` as an `Int64`. """ -> func(dt::TimeType) end WARNING: replacing docs for 'func :: Tuple{Base.Dates.TimeType}'. WARNING: replacing docs for 'func :: Tuple{Base.Dates.TimeType}'. WARNING: replacing docs for 'func :: Tuple{Base.Dates.TimeType}'. WARNING: replacing docs for 'func :: Tuple{Base.Dates.TimeType}'. WARNING: replacing docs for 'func :: Tuple{Base.Dates.TimeType}'. WARNING: replacing docs for 'func :: Tuple{Base.Dates.TimeType}'. ``` where only the last doc, `millisecond`, is stored. What's *really* being stored is a doc for `func`: ```julia julia> keys(Docs.meta(Main)) Any[func] ``` since in the loop you're redefining a global named `func` on each iteration and then attaching a doc to that. Best to avoid `eval` as much as possible and use the double `$` trick for this kind of thing. -- Mike On Thursday, 3 March 2016 17:17:31 UTC+2, Curtis Vogt wrote: > > Thanks Mike, I also managed to come up with an alternative solution: > > using Base.Dates > for name in (:year, :month, :day, :hour, :minute, :second, :millisecond) > func = eval(name) > @doc """ > $name(dt::TimeType) -> Int64 > > Return the $name of a `Date` or `DateTime` as an `Int64`. > """ -> func(dt::TimeType) > end > > Not sure which I like better yet. > > On Thursday, March 3, 2016 at 9:05:36 AM UTC-6, Michael Hatherly wrote: >> >> Just needs extra `$`s in the docstring, one for expression interpolation >> and one for string interpolation: >> >> julia> for name in (:year, :month, :day, :hour, :minute, :second, : >> millisecond) >> @eval begin >> @doc """ >> $($name)(dt::TimeType) -> Int64 >> >> Return the $($name) of a `Date` or `DateTime` as an >> `Int64`. >> """ -> >> $name(dt::TimeType) >> end >> end >> >> (`name` will be displayed fully qualified, i.e. `Base.Dates.year`, so you >> could convert `name` it to a string to avoid that.) >> >> -- Mike >> >> On Thursday, 3 March 2016 16:44:38 UTC+2, Curtis Vogt wrote: >>> >>> I was hoping to generate several redundant docstrings using code >>> generation. Unfortunately I have run into an issue where $name isn't >>> being replaced in the docstring: >>> >>> julia> using Base.Dates >>> >>> julia> for name in (:year, :month, :day, :hour, :minute, :second, : >>> millisecond) >>> @eval begin >>> @doc """ >>> $name(dt::TimeType) -> Int64 >>> >>> Return the $name of a `Date` or `DateTime` as an `Int64`. >>> """ -> >>> $name(dt::TimeType) >>> end >>> end >>> ERROR: UndefVarError: name not defined >>> in eval(::Module, ::Any) at ./boot.jl:267 >>> [inlined code] from ./boot.jl:266 >>> in anonymous at ./no file:4294967295 >>> in eval(::Module, ::Any) at ./boot.jl:267 >>> >>> >>> >>> Is there a way I can get this to work? >>> >>