2017-03-27 17 views
5

जूलिया में, methods फ़ंक्शन का उपयोग फ़ंक्शन के तरीकों को पुनर्प्राप्त करने के लिए किया जा सकता है।मैं जूलिया मैक्रो के तरीकों को कैसे प्राप्त कर सकता हूं?

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 ession का उपयोग कर मैक्रो होना करने की कोशिश की है, लेकिन इस काम नहीं किया।

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

मैं मैक्रो के तरीकों को कैसे प्राप्त कर सकता हूं?

+1

'तरीकों (eval (चिह्न (" @ जी ")))' मेरे लिए काम किया है, लेकिन वहाँ एक क्लीनर विधि होना चाहिए –

+3

क्लीनर (बिना 'eval' के साथ): 'विधियों (मुख्य। (प्रतीक (" @ जी "))) –

+4

@DanGetz नाइस। लेकिन हाँ, वहाँ * एक क्लीनर विधि होना चाहिए ... (वैसे, 'मुख्य। (प्रतीक ("@ जी")) 'बहिष्कृत है, और' गेटफील्ड (मुख्य, प्रतीक (" @ जी ")' चाहिए इसके बजाय इस्तेमाल किया जाना चाहिए।) –

उत्तर

1

मैं रेखा के साथ साथ मेरी ~/.juliarc.jl में एक सामान्य मैक्रो (@methods) एक मॉड्यूल (MethodsMacro) के अंदर डाल दिया जाएगा: 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  
संबंधित मुद्दे