2017-03-27 5 views
5

In Julia kann die methods Funktion verwendet werden, um die Methoden einer Funktion abzurufen.Wie kann ich die Methoden eines Julia-Makros abrufen?

julia> f(::Int) = 0 
f (generic function with 1 method) 

julia> f(::String) = "" 
f (generic function with 2 methods) 

julia> methods(f) 
# 2 methods for generic function "f": 
f(::String) in Main at REPL[1]:1 
f(::Int64) in Main at REPL[0]:1 

Makros können auch mehrere Methoden haben.

julia> macro g(::Int) 
      0 
     end 
@g (macro with 1 method) 

julia> macro g(::String) 
      "" 
     end 
@g (macro with 2 methods) 

julia> @g 123 
0 

julia> @g "abc" 
"" 

jedoch die methods Funktion scheint nicht auf Makros zu arbeiten, weil Julia zuerst das Makro aufruft, aufgrund der Tatsache, dass sie Klammern nicht brauchen.

julia> methods(@g) 
ERROR: MethodError: no method matching @g() 
Closest candidates are: 
    @g(::String) at REPL[2]:2 
    @g(::Int64) at REPL[1]:2 

Ich habe versucht, eine Expr ITZUNG mit dem Makro enthalten, aber das hat nicht funktioniert.

julia> methods(:@g) 
# 0 methods for generic function "(::Expr)": 

Wie kann ich die Methoden eines Makros abrufen?

+1

'Methoden (eval (Symbol („@ g“)))' arbeitete für mich, aber es muss eine sauberere Methode –

+3

Reiniger (ohne 'eval'):' Methoden (Main. (Symbol ("@ g"))) ' –

+4

@DanGetz Schön. Aber ja, da * sollte * eine sauberere Methode sein ... (Übrigens, 'Main. (Symbol (" @ g "))' ist veraltet, und 'getfield (Main, Symbol (" @ g ")' sollte) stattdessen verwendet werden.) –

Antwort

1

würde ich eine generische Makro (@methods) innerhalb eines Moduls (MethodsMacro) in meinem ~/.juliarc.jl zusammen mit der Linie setzen: using MethodsMacro. So kann man es zur Verfügung haben würde jede Julia Sitzung, so etwas wie:

julia> module MethodsMacro            

     export @methods            

     macro methods(arg::Expr)          
      arg.head == :macrocall || error("expected macro name") 
      name = arg.args[] |> Meta.quot       
      :(methods(eval($name)))         
     end               

     macro methods(arg::Symbol)         
      :(methods($arg)) |> esc         
     end               

     end               
MethodsMacro                

julia> using MethodsMacro             

julia> @methods @methods            
# 2 methods for macro "@methods":         
@methods(arg::Symbol) at REPL[48]:12         
@methods(arg::Expr) at REPL[48]:6         

julia> f() = :foo; f(x) = :bar          
f (generic function with 2 methods)         

julia> @methods f             
# 2 methods for generic function "f":        
f() at REPL[51]:1             
f(x) at REPL[51]:1  
Verwandte Themen