मैं मैक्रो के अंदर कीवर्ड तर्कों के साथ एक कन्स्ट्रक्टर बनाना चाहता हूं, और पहले कीवर्ड तर्क को अभिव्यक्ति के लिए होना आवश्यक है। मुझे अभिव्यक्ति में उस अभिव्यक्ति को डालने में परेशानी हो रही है। मेरा मतलब यह है कि मेरा क्या मतलब है। मान लें कि मेरे पासअभिव्यक्ति में एक अभिव्यक्ति को अभिव्यक्त करना
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
प्राप्त करने की आवश्यकता है, लेकिन मैं कैसे एक अभिव्यक्ति में है कि अभिव्यक्ति पाने के लिए पता नहीं है।
धन्यवाद। वह खूबसूरती से काम किया। 'Meta.quot' वास्तव में क्या है, और यह इससे अलग क्यों है: (orig_ex)? –
@ChrisRackauckas 'Meta.quot (ex)' बस 'expr (: उद्धरण, पूर्व)' है: 'जुलिआ> पूर्व =: (ए + बी); @assert Meta.quot (ex) == Expr (: उद्धरण, पूर्व) ' – SalchiPapa
मेटा.क्वॉट उद्धरण का एक और स्तर जोड़ता है। जैसा कि आपने पाया, जब आप इंटरपोलेट करते हैं, तो बस इसका उपयोग करें: (orig_ex) उद्धरण रखने के लिए पर्याप्त नहीं है। मेरे अनुभव में सही होने के लिए ये चीजें बहुत मुश्किल हैं! –