2016-09-28 20 views
5

मैं मैक्रो के अंदर कीवर्ड तर्कों के साथ एक कन्स्ट्रक्टर बनाना चाहता हूं, और पहले कीवर्ड तर्क को अभिव्यक्ति के लिए होना आवश्यक है। मुझे अभिव्यक्ति में उस अभिव्यक्ति को डालने में परेशानी हो रही है। मेरा मतलब यह है कि मेरा क्या मतलब है। मान लें कि मेरे पासअभिव्यक्ति में एक अभिव्यक्ति को अभिव्यक्त करना

type Test 
    ex 
end 

है जिसमें एक अभिव्यक्ति है। मैं एक कन्स्ट्रक्टर बनाना चाहता हूं जहां origex = :(a * b) एक कीवर्ड तर्क से डिफ़ॉल्ट है। मैं

@eval :(Test(ex=$origex) = Test(origex)) 

की कोशिश की लेकिन अगर आप अभिव्यक्ति करता है कि देखो:

Test(ex=a * b) = begin # console, line 1: 
    Test(origex) 
end 

आप देखते हैं कि यह क्योंकि a*b अभी भी एक अभिव्यक्ति की जरूरत है काम नहीं करेगा। इसलिए मैं

@eval :(Test(ex=:($origex)) = Test(origex)) 

की कोशिश की लेकिन इस अजीब अभिव्यक्ति

Test(ex=$(Expr(:quote, :($(Expr(:$, :origex)))))) = begin # console, line 1: 
    Test(origex) 
end 

जो भी नहीं होगा eval है। इसके बजाय मैं eval करने के लिए अभिव्यक्ति के रूप में

Test(ex=:(a * b)) = begin # console, line 1: 
    Test(origex) 
end 

प्राप्त करने की आवश्यकता है, लेकिन मैं कैसे एक अभिव्यक्ति में है कि अभिव्यक्ति पाने के लिए पता नहीं है।

उत्तर

6

मुझे लगता है कि आप जो चाहते हैं वह निम्नलिखित है। आपको कुछ गलतियां हुईं:

julia> type Test 
     ex::Expr 
     end 

julia> orig_ex = :(a + b) 
:(a + b) 

julia> new_ex = Meta.quot(orig_ex) 
:($(Expr(:quote, :(a + b)))) 

julia> code = :(Test(; ex=$new_ex) = Test(ex)) 
:(Test(; ex=$(Expr(:quote, :(a + b)))) = begin # REPL[4], line 1: 
      Test(ex) 
     end) 

julia> eval(code) 
Test 

julia> Test() 
Test(:(a + b)) 
+1

धन्यवाद। वह खूबसूरती से काम किया। 'Meta.quot' वास्तव में क्या है, और यह इससे अलग क्यों है: (orig_ex)? –

+1

@ChrisRackauckas 'Meta.quot (ex)' बस 'expr (: उद्धरण, पूर्व)' है: 'जुलिआ> पूर्व =: (ए + बी); @assert Meta.quot (ex) == Expr (: उद्धरण, पूर्व) ' – SalchiPapa

+0

मेटा.क्वॉट उद्धरण का एक और स्तर जोड़ता है। जैसा कि आपने पाया, जब आप इंटरपोलेट करते हैं, तो बस इसका उपयोग करें: (orig_ex) उद्धरण रखने के लिए पर्याप्त नहीं है। मेरे अनुभव में सही होने के लिए ये चीजें बहुत मुश्किल हैं! –

संबंधित मुद्दे