2014-07-16 12 views
10

मैंने देखा है कि निम्न कोड को संकलित करता है और वी.एस. 2013 में काम करता है:फ़ंक्शन के अंदर "डू" क्यों अनुमति दी जाती है?

let f() = 
    do Console.WriteLine(41) 
    42 

लेकिन जब एफ # 3.0 विनिर्देश को देख मैं do का कोई उल्लेख इस तरह से इस्तेमाल किया जा रहा नहीं मिल रहा। जहाँ तक मेरा बता सकते हैं, do निम्नलिखित का उपयोग करता है हो सकता है:

  • लूप के एक भाग के रूप (जैसे while expr do expr done), उस मामले यहाँ नहीं है।
  • गणना भाव अंदर

    , उदा .:

    seq { 
        for i in 1..2 do 
        do Console.WriteLine(i) 
        yield i * 2 
    } 
    

    कि यहाँ या तो मामले में नहीं है, f किसी भी गणना भाव शामिल नहीं है।

    हालांकि मुझे यहां क्या भ्रमित करता है यह है कि विनिर्देश के अनुसार, doin द्वारा पालन किया जाना चाहिए। हल्के वजन वाले वाक्यविन्यास के कारण in वैकल्पिक होना चाहिए, लेकिन इसे यहां जोड़ना एक संकलन त्रुटि ("अप्रत्याशित टोकन 'या' अधूरा अभिव्यक्ति" में) का कारण बनता है।

  • मॉड्यूल या कक्षा के अंदर वक्तव्य। यह यहां भी मामला नहीं है, do एक फ़ंक्शन के अंदर है, मॉड्यूल या कक्षा के अंदर नहीं।

मैं यह भी देखा कि #light "off" साथ, कोड संकलन नहीं करता है ("अप्रत्याशित कीवर्ड बंधन में 'do'"), लेकिन मैं कुछ भी है कि या तो हल्के वाक्य रचना पर अनुभाग में इस व्याख्या नहीं मिला ।

इस सब के आधार पर, मुझे लगता है कि एक समारोह के अंदर do का उपयोग करके इस तरह संकलित नहीं होना चाहिए, लेकिन ऐसा करता है। क्या मुझे विनिर्देशन में कुछ याद आया? या यह वास्तव में संकलक में या विनिर्देश में एक बग है?

+2

इसे 'डू' बाध्यकारी कहा जाता है। मैं इसे spec में नहीं मिला, लेकिन यह [एमएसडीएन पर दस्तावेज] (http://msdn.microsoft.com/en-us/library/dd393786.aspx) है। – Daniel

+0

@Daniel मैंने तीसरा मामला बताया है, एक मॉड्यूल के अंदर 'do''। "जब आप किसी फंक्शन के स्वतंत्र रूप से * कोड निष्पादित करना चाहते हैं तो एक बाध्यकारी का उपयोग करें * – svick

+1

उद्धरण को समाप्त करने के लिए: _ फ़ंक्शन * या वैल्यू डेफिनिशन * पर निर्भरता। * दूसरा मामला किसी फ़ंक्शन के भीतर लागू हो सकता है। – Daniel

उत्तर

7

documentation on MSDN से:

एक do बाध्यकारी एक समारोह या मूल्य को परिभाषित करने के बिना कोड निष्पादित करने के लिए प्रयोग किया जाता है।

भले ही स्पेस में स्थानों की एक व्यापक सूची नहीं है, यह केवल unit प्रकार के रूप में अभिव्यक्त अभिव्यक्ति है। कुछ उदाहरण:

if ((do()); true) then() 
let x: unit = do() 

यह आम तौर पर छोड़ा जाता है। पिछले उदाहरणों में से प्रत्येक do के बिना मान्य हैं। इसलिए, do केवल पर कार्य करता है पर जोर दें कि एक अभिव्यक्ति unit प्रकार है।

+0

मुझे लगता है कि spec इसे अस्वीकार करता है, क्योंकि इसे 'expr' (§6 और §A.2.3) के विकल्पों में से एक के रूप में सूचीबद्ध नहीं किया गया है। – svick

+0

पिछले कुछ वर्षों में मैंने फ़ंक्शन या विधि में उपयोग किए जाने वाले 'डू' के कई उदाहरण देखे हैं। यदि यह व्यवहार जानबूझकर नहीं है, तो यह इस बिंदु पर वास्तव में मान्य है। हालांकि, मुझे लगता है कि यह मामला नहीं है और इस बिंदु पर कल्पना अपूर्ण है। – Daniel

0

F# 3.0 specification अभिव्यक्ति वाक्य रचना के माध्यम से जा रहे हैं do exprclass-function-or-value-defn (प्रकार) के एक विकल्प के रूप में [Ch 8, A.2.5] और module-function-or-value-defn (मॉड्यूल) है [A.2.1.1 चौधरी 10,]।

मैं वास्तव में उस स्पेक में नहीं देखता जहां function-defn में एक से अधिक अभिव्यक्ति हो सकती है, आखिरकार आखिरी एक unit का मूल्यांकन करता है - या आखिरी अभिव्यक्ति को कार्य मूल्य को निर्धारित करने में अनदेखा किया जाता है।

तो, ऐसा लगता है कि यह दस्तावेज़ीकरण में एक निरीक्षण है।

+0

"मैं वास्तव में उस spec में नहीं देखता जहां 'function-defn' में एक से अधिक अभिव्यक्ति हो सकती है" यह' expr = expr; expr' नियम और तथ्य यह है कि हल्के सिंटैक्स अर्धविराम वैकल्पिक बनाता है। – svick

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

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