2017-01-08 9 views
9

मैं एक कमांड लाइन प्रोग्राम के पर्ल 6 कार्यान्वयन के साथ खेल रहा था जिसमें कई स्विच होते हैं। MAIN पर हस्ताक्षर काफी शामिल था और थोड़ा गन्दा था।क्या मैं पर्ल 6 में हस्ताक्षर के रूप में एक स्टैंडअलोन हस्ताक्षर का उपयोग कर सकता हूं?

# possibly big and messy signature 
my $sig; 
BEGIN { $sig = :(Int $n, Int $m) }; 

multi MAIN ($sig) { 
    put "Got $n and $m"; 
    } 

MAIN भले ही हस्ताक्षर MAIN से पहले सेट कर दिया जाता हस्ताक्षर में चर नहीं देखता संकलित:

अगर वहाँ कहीं और हस्ताक्षर को परिभाषित करने और सबरूटीन क्या उपयोग करने के लिए बताने के लिए एक तरीका था मैंने सोचा
===SORRY!=== Error while compiling /Users/brian/Desktop/signature.p6 
Variable '$n' is not declared 
at /Users/brian/Desktop/signature.p6:7 

मुझे लगा कि इस तरह की चीज संकलन समय के बाद विधियों को उत्पन्न करने और विभिन्न कारकों के आधार पर हस्ताक्षर चुनने के लिए आसान हो सकती है।

+0

जो भी '(...) में है' है हस्ताक्षर, तो यह कभी काम नहीं करेगा। जिस तरह से आप यह करेंगे कम स्तर और कार्यान्वयन विशिष्ट होगा। मैं इसे एक सामान्य हस्ताक्षर करने की कोशिश करता हूं, और पार्स किए जाने के बाद हस्ताक्षर को बलपूर्वक बदल देता हूं। यह बहु प्रेषक को बदलने के लिए rigamarole को अनदेखा कर रहा है। –

+0

फ़ंक्शन के अंदर चर के लिए "वैरिएबल घोषित नहीं किया गया" त्रुटियों को फेंकने के लिए, यह मैक्रो की तरह कुछ संकलित समय पर किया जाना होगा। दुर्भाग्यवश, पर्ल 6 के लिए योजना बनाई गई मैक्रो/स्लैंग कार्यक्षमता, अभी तक भौतिक नहीं हुई है। – smls

+0

एक तरफ ध्यान दें: आप शीर्ष-स्तरीय दायरे में एक चर घोषित कर सकते हैं और BEGIN फ़ेज़र के ब्लॉक-कम रूप का उपयोग करके इसे एक वक्तव्य में BEGIN समय पर प्रारंभ कर सकते हैं: 'BEGIN my $ foo = ...; ' – smls

उत्तर

7

संक्षिप्त उत्तर: नहीं

लंबा उत्तर: फिर भी नहीं। और यदि आप कर सकते हैं, तो आप सभी प्रकार की परेशानी में भाग लेंगे, क्योंकि आपके उदाहरण में केवल एक चर $n है। यदि आप कई बार हस्ताक्षर का उपयोग करते हैं (या केवल एक बार इसका उपयोग करें, और उस सबराउटिन में पुन: कार्य करें जिसे आपने संलग्न किया है), प्रत्येक हस्ताक्षर बाध्यकारी उस चर में पिछले मान को ओवरराइट करेगा, जिससे दूरी पर कुछ डरावनी कार्रवाई हो जाएगी। फ्री-फ़्लोटिंग हस्ताक्षर में शामिल चरों को क्लोन करने के लिए बस एक तंत्र नहीं है।

वास्तविक दिनचर्या में एक मैच-सभी हस्ताक्षर का उपयोग करने जैसे कामकाज, और उसके बाद हस्ताक्षर पर कब्जा बांधने के लिए इसका उपयोग इस दोष से पीड़ित है, और इस प्रकार आईएमएचओ परेशानी के लायक नहीं है।

हो सकता है कि अब तक भविष्य में, कुछ बहुत ही उन्नत मैक्रो सुविधा आपको हस्ताक्षर प्रत्यारोपित करने की अनुमति सकता है, लेकिन मुझे नहीं लगता कि मैक्रो विकास का वह हिस्सा अभी भी हमारे रोडमैप पर है।

इसके बजाय नंगे हस्ताक्षर पुन: उपयोग की

, आप (संभवतः अनाम) एक हस्ताक्षर संलग्न के साथ दिनचर्या का पुन: उपयोग करना चाहिए, और, नाम आप चाहते हैं के साथ उन्हें स्थापित उदाहरण के लिए

sub f(Int $n, Int $m) { 
    # do something sensible here with $n and $m 
} 
constant &MAIN = &f; 
# reuse &f for more 
+0

फिर स्टैंडअलोन हस्ताक्षर घोषित करने का क्या मतलब है, अगर उन्हें कहीं भी इस्तेमाल नहीं किया जा सकता है? – jjmerelo

+1

मुद्दा यह है कि, मुझे लगता है कि आप 'ब्लॉक' के हस्ताक्षर के साथ दिए गए (शाब्दिक) 'हस्ताक्षर' को स्मार्टमैच कर सकते हैं, उदा। 'सब ए ($ ए) {}; डीडी और a.signature ~~: ($ बी) ' –

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

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