2014-09-27 6 views
6

मैं metaprogramming का उपयोग कर this question उत्तर देना चाहते हैं का उपयोग कर जूलिया में शीर्ष स्तर चर की घोषणा, लेकिन छोरों के लिए की scoping नियम उत्पन्न कर रहे हैं मेरी चर सबसे ऊपरी (आरईपीएल) दायरे में नहीं परिभाषित किया जाना:metaprogramming

for x = [:A1, :A2] 
    @eval x = rand(2,2) 
end 

मुझे पता है कि इसके आसपास शायद एक आसान तरीका है, लेकिन मेरी शुक्रवार की रात मस्तिष्क एक के बारे में नहीं सोच सकता है। क्या आप में से एक मेटाप्रोग्रामिंग जंकियां मुझे एक संक्षिप्त समाधान खोजने में मदद कर सकती हैं? (मुझे पता है किसी मैक्रो से बचने के साथ काम कर सकते हैं, लेकिन मैं कम कुछ के बारे में सोच रहा हूँ)

+0

मैंने यह भी देखा और आश्चर्य किया कि अगर आप सौ ए हैं तो आप इसे कैसे मेट्रोग्राम करेंगे। 'x = 1: 100' के लिए और फिर क्या? चर नामों को प्रोग्रामेटिक तरीके से कैसे बनाया जा सकता है? – rickhg12hs

+1

ने अपनी टिप्पणी/प्रश्न का उत्तर दिया। 'के = 1: 10 my_sym = प्रतीक (" ए "* स्ट्रिंग (के)); @eval $ my_sym = रैंड (2,2) एंड' (यहां ए 1 के माध्यम से ए 1 उत्पन्न किया गया।) – rickhg12hs

उत्तर

7

आप केवल वैश्विक क्षेत्र में चर को परिभाषित करना चाहते हैं, तो आप सिर्फ एक $ छूट रहा है:

for x = [:A1, :A2] 
    @eval $x = rand(2,2) 
end 

लेकिन @eval हमेशा शीर्ष स्तर पर मूल्यांकन किया जाता है भले ही आप इसे किसी फ़ंक्शन के अंदर रखें।

@eval function f() 
    ... 
    $([:($x = rand(2, 2)) for x in [:A1, :A2]]...) 
    ... 
end 

इस कोड को भी तुच्छता से एक में रूपांतरित किया जा सकता है: आप एक समारोह दायरे में चर को परिभाषित करना चाहते हैं, तो आप @eval अंदर पूरे समारोह में कहें, कोड ब्लॉक का निर्माण, और समारोह में अंतर्वेशन की जरूरत है मैक्रो (लेकिन फिर इसे esc की आवश्यकता है)।

+0

आह, धन्यवाद। आपके दूसरे उदाहरण के लिए मैंने एक कट डाउन संस्करण की कोशिश की लेकिन मिल गया: जुलिए> @ औसत $ ([: ($ x = rand (2,2)) x में [: ​​B1,: B2]] ...) त्रुटि: टाइप करें: apply_type: वरग में, अपेक्षित प्रकार {टी <: टॉप}, ऐरे {एक्सप्र, 1} – JKnight

+0

मिला है लगता है कि आपको एक्स @ के लिए $ @eval प्रारंभ ([: ($ x = rand (2,2)) की आवश्यकता है [ : बी 1,: बी 2]] ...) अंत 'या 'eval (expr (: ब्लॉक, [: ($ x = रैंड (2,2)) x में [: ​​बी 1,: बी 2]] ...)) 'इसके लिए काम करने के लिए। लेकिन मुझे यकीन नहीं है कि बहुत अधिक बिंदु है, क्योंकि यह अभी भी वैश्विक दायरे में चर को परिभाषित करेगा, भले ही आप इसे एक फ़ंक्शन के अंदर रखें, और अगर ऐसा लगता है कि मेरा पहला उदाहरण थोड़ा अच्छा दिखता है। – simonster

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