Macros are run at parse time, which means you're building your error
message way before you have a chance to call it with concrete types. You'll
need to change it to build the error message string in the function body,
not the macro. You can probably just map "typeof" to your function
arguments.

On Monday, July 27, 2015, Christoph Ortner <[email protected]>
wrote:

> This is my first attempt at metaprogramming, so apologies if this should
> be obvious from the documentation (or just obvious):
>
> For defining an interface I am implementing "dummy functions" which just
> return a tailored error message if an interface function has not been
> implemented. At the moment this largely duplicates the standard Julia
> behaviour, but it just gives a little more information (e.g. the
> information that a certain function ought to be part of an interface), but
> long-term I want to give it additional functionality, e.g. more information.
>
> Because I am implementing many of these interface functions, I tried to
> write a macro:
>
> module Test
> using Docile, Lexicon, Compat
> export ffun
>
> macro protofun(fname, argtypes...)
>     # preprocess the arguments to generate an error message
>     errmsg = "AbstractAtomsInterface: `$(string(fname))("
>     for n = 1:length(argtypes)-1
>         errmsg *= string(argtypes[n]) * ", "
>     end
>     errmsg = errmsg[1:end-2] * ")' has no implementation."
>
>     eval(quote
>          @doc $(argtypes[end])->
>         function $(fname)($(argtypes[1:end-1]...))
>             error($errmsg)
>         end
>     end)
> end
>
> @protofun(ffun, ::Number, ::String, doc"yads")
> end
>
>
> When I run this:
>
>
> julia> using Test
>
> julia> ffun(1.0, "abc")
> ERROR: AtomsInterface: `ffun(::Number, ::String)' has no implementation.
>  in ffun at /Users/ortner/gits/Atoms.jl/Test.jl:20
>
>
> What I would like to see is
>
> ERROR: AtomsInterface: `ffun(::Float64, ::ASCIIString)' has no
> implementation.
>  in ffun at /Users/ortner/gits/Atoms.jl/Test.jl:20
>
> It is clear to me why my implementation does not work as I hope, but I
> don't see how to make this work. I would be grateful about any suggestions.
>
> Many thanks,
> Christoph
>
>

Reply via email to