2011-11-18 16 views
12

मुझे कुछ समस्याएं आ रही हैं कि "लेट" फॉर्म का उपयोग कैसे करें। नीचे दिए गए उदाहरण में, मैं फ़ंक्शन में बाद में काम करने के लिए स्थानीय रूप से "कोल्स" मान बांधना चाहता हूं। हालांकि, मैं जो देख रहा हूं, वह यह है कि यदि मैं "चलो" फ़ंक्शन का उपयोग करता हूं तो sel-opt-tmp एक सूची के बजाय एक शून्य मान वापस कर देगा।क्लोजर: स्कोप और फंक्शन रिटर्न वैल्यू

(defn sel-opt-tmp [] 
    (let [cols "test"])) 

(prn (sel-opt-tmp)) 

* उपरोक्त कोड एक शून्य मूल्य देता है।

मैं समझता हूं कि "चलो" केवल एक कार्य के दायरे में एक मूल्य को बांधता है, जो मुझे नहीं पता कि अगर स्कोप के मूल्य को पारित करने का कोई तरीका है। हो सकता है कि "वापसी" जैसी कोई चीज़ है जिसे मुझे पता नहीं है? या यह बस खराब डिजाइन है और मुझे इस मामले में बाध्यकारी का उपयोग नहीं करना चाहिए (यह उन कार्यों के लंबे श्रृंखला बनाने के लिए होता है जो पढ़ना मुश्किल है)?

+2

'चलो' फॉर्म पूरी तरह से अंतिम अभिव्यक्ति देता है, जिसमें आपके मामले में अदृश्य 'शून्य' है। आपको इसे 'लौ' फॉर्म के शरीर में 'कोल्स' का उपयोग करने की आवश्यकता है। – seh

+0

'" चलो "केवल फ़ंक्शन के दायरे में एक मान को बांधता है - यह बिल्कुल सही नहीं है। 'चलिए कहीं भी कहीं भी दिखाई दे सकते हैं, और बाध्य नामों का दायरा' चलो 'अभिव्यक्ति है। –

उत्तर

17

यह शून्य देता है क्योंकि लेट स्टेटमेंट की सामग्री खाली है (या शून्य)। प्रयास करें:

(let [cols "test"] cols)

कौन सा cols के परिणाम प्रदान करेंगे। जैसा कि सीएच कहते हैं, एक बयान स्टेटमेंट अपनी अंतिम उप-अभिव्यक्ति के मूल्य का मूल्यांकन करता है।

+1

एक 'लेट' फॉर्म स्वयं अभिव्यक्ति है, जो * अंतिम * की अंतिम उप-अभिव्यक्ति के मूल्य पर * मूल्यांकन करता है! –

+0

धन्यवाद मैट, मैंने शब्द अपडेट किया है। पता नहीं क्यों मैंने पहले नहीं किया ... –

3

जैसा कि आप उल्लेख करते हैं, दायरे के बाहर मूल्यों को पारित करने में ऐसी कोई समस्या नहीं है। बाइंडिंगcols केवल दायरे के भीतर लागू है, लेकिन का (:ks cols) का जीवन समान रूप से प्रतिबंधित नहीं है। (यही कारण है कि आपके पास कचरा संग्रह है: आप डेटा को इंगित करने वाले मान वापस कर सकते हैं, और डेटा तब तक रहता है जब तक संदर्भ हैं।)

यदि आपको फ़ंक्शन से शून्य मिलती है, तो संभवतः cols करता है :ks कुंजी नहीं है ... या वास्तव में एक नक्शा नहीं हो सकता है। चूंकि colsfilter का परिणाम है, यह एक अनुक्रम है, और जब :ks कीवर्ड को फ़ंक्शन के रूप में उपयोग किया जाता है, तो यह गैर संग्रहों के लिए शून्य देता है। (:ks cols) के बजाय (cols :ks) लिखने के लिए हमेशा एक उपयोगी सम्मेलन हो सकता है ताकि आप एक त्रुटि प्राप्त कर सकें जब आपको लगता है कि नक्शा कुछ और है।

+0

हैलो, मैंने एक छोटा परीक्षण किया और अभी भी एक शून्य हो रही है। कोड ऊपर है। – kfk

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