2017-03-27 5 views
5

Juliaでは、関数のメソッドを取得するのに、methods関数を使用できます。Juliaマクロのメソッドを取得するにはどうすればよいですか?

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 

マクロには複数の方法もあります。

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" 
"" 

しかし、methods機能はジュリアは最初、それらが括弧を必要としないという事実のために、マクロを呼び出すためのマクロで動作するようには思えません。

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

マクロを格納するためにExprセッションを使用しようとしましたが、これは機能しませんでした。

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

マクロのメソッドを取得するにはどうすればよいですか?

+1

'メソッド(evalの(記号(「@ gは」)))'私のために働いたが、クリーナークリーナー方法 –

+3

がなければなりません( 'eval'なし):'メソッド(Main。(Symbol( "@ g"))) ' –

+4

@DanGetz Nice。しかし、メイン(Symbol( "@ g")) 'は推奨されておらず、' getfield(Main、Symbol( "@ g") 'は、代わりに使用してください)。 –

答えて

1

私の~/.juliarc.jlのモジュール(MethodsMacro)の中に汎用マクロ(@methods)を次の行と共に挿入します。using MethodsMacroあなたはすべてのジュリアセッションでそれが利用できる必要があると思います。この方法では、何かのように:

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  
関連する問題