2011-02-27 10 views
10

घोषित करें मुझे Devel::Declare के साथ कीवर्ड बनाने की कोशिश करने में समस्या हो रही है। इस मामले में बहुत से उदाहरण और ट्यूटोरियल नहीं हैं।डेवेल के साथ एक नया पर्ल कीवर्ड बनाना ::

my @arr = qw/foo bar baz/; 
@arr doing $x { 
    print "x is $x"; 
}; 

मेरा विचार Devel::Declare पार्स हुक के साथ एक for my $x (@arr) { ... } बयान में बदल करने के लिए है:

मेरे पालतू परियोजना में एक नया कीवर्ड doing इस जैसे एक वाक्य रचना रूबी के do के समान है, है कि कहा जाता है बनाने के लिए है। मुझे यकीन नहीं है कि यह संभव है।

मुझे मिले उदाहरणों में से अधिकांश (Devel::Declare परीक्षण निर्देशिका से) method-स्टाइल कीवर्ड बनाने के लिए हैं।

मैं शुरू करने के तरीके पर कुछ पॉइंटर्स की सराहना करता हूं, या मुख्य कार्य को संभालने में सक्षम होने के लिए उपयोग करने के लिए महत्वपूर्ण कार्यों का उपयोग करता हूं, या आधारभूत आधार पर मौजूदा कोड।

उत्तर

14
  1. डेवेल :: घोषणा आपको वापस लेने की अनुमति नहीं देगी जो पहले से ही पार्स किया गया है। यदि आप doing को किसी कीवर्ड में बदलते हैं, तो @arr doing ... को अभी भी @arr से शुरू होने की आवश्यकता है, जो कि एक बड़ी बाधा की तरह दिखता है।
  2. जिस तरह से डेवेल :: अपने जादू को अकल्पनीय रूप से घोषित करता है, यह एक विशिष्ट तरीके से सीमित है - यह केवल आपको "कीवर्ड" घोषित करने देता है जो सबस के नाम की तरह दिखते हैं, जहां पर्ल देख रहे हैं उप के नाम यह आपको मनमाने ढंग से ऑपरेटरों को रखने की अनुमति नहीं देगा जहां आप चाहें। वास्तव में यह स्थितियों में कम से कम विकृति के साथ काम करता है जहाँ आप keywordsomestuff{ ... } जो यह keyword(कुछ अन्य सामान के लिए एक सरल कॉल में बदल सकते हैं और एक संभवतःsub { ... }) तब्दील किया है। आप देख सकते हैं कि यह method या Test::Class::Sugar जैसी चीज़ों के लिए खुद को इतना अच्छा क्यों देता है। मेरा मुद्दा यह है कि एक सरणी के नाम के तुरंत बाद ऐसी जगह है जहां परल पार्सर उप के नाम की तलाश में है; यह एक ऐसा स्थान है जहां पार्सर ऑपरेटर की तलाश में है, और इसलिए @arr doing ... आपको डेवेल से पहले bareword found where operator expected त्रुटि देगा: घोषणा को हस्तक्षेप करने का कोई मौका मिलता है।

उन दोनों ने शायद चारों ओर ताकि आपके कीवर्ड प्रकट होता है लाइन पर पहले चीजों को बदलने के द्वारा दूर किया जा सकता है, लेकिन अब आप keywordsomestuff{ ... }, जहां सरणी के नाम somestuff है और आप दृढ़ता से इस पैटर्न के भीतर हैं कि अधिकांश मॉड्यूल का निर्माण किया गया है - केवल तभी यदि आप लूप के लिए उत्पन्न कर रहे हैं, तो आप शायद इसे उप-उपनाम के रूप में पार्स करने के बजाय ब्लॉक को वास्तविक ब्लॉक के रूप में छोड़ देंगे इसके बजाय परिभाषा।

+2

यह बताता है कि सबकुछ इतना 'विधि' उन्मुख क्यों है। धन्यवाद। बीटीडब्लू, मैंने अभी पाया है कि मैं सादे पर्ल के साथ काफी कुछ कर सकता हूं: '@arr ~~ sub {my $ x = shift; प्रिंट "एक्स $ x"} 'है। शायद मैं इसे डेवेल :: घोषित करने के साथ गठबंधन करने की कोशिश करूंगा। – ojosilva

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