2010-03-08 1 views
10

मैं सोच रहा था कि लिस्प में लेबल के उपयोग के संबंध में मानक अभ्यास है या नहीं। मैं Generating permutations lazily पर पहले उत्तर में वर्णित एल्गोरिदम के लिस्प कार्यान्वयन के साथ गड़बड़ कर रहा हूं, मेरा वर्तमान संस्करण कार्यक्षमता के भाग को तोड़ने के लिए लेबल का उपयोग करता है।लिस्प स्टाइल प्रश्न स्थानीय कार्यों का लेबल लेबल या नहीं?

(defun next-permutation (pmute) 
    (declare (vector pmute)) 
    (let ((len (length pmute))) 
    (if (> len 2) 
     (labels ((get-pivot() 
        (do ((pivot (1- len) (1- pivot))) 
         ((or (= pivot 0) 
          (< (aref pmute (1- pivot)) 
           (aref pmute pivot))) 
         pivot))) 
       (get-swap (pivot) 
        (let ((swp (1- len))) 
        (loop for i from (1- len) downto pivot do 
          (if (or (and (> (aref pmute i) 
              (aref pmute (1- pivot))) 
             (< (aref pmute i) (aref pmute swp))) 
            (< (aref pmute swp) (aref pmute (1- pivot)))) 
           (setf swp i))) 
        swp)) 
       (next (swp pivot) 
        (rotatef (aref pmute (1- pivot)) (aref pmute swp)) 
        (reverse-vector pmute pivot (1- len)))) 
      (let ((piv (get-pivot))) 
      (if (> piv 0) 
       (next (get-swap piv) piv) 
       nil)))))) 

के बाद से प्रत्येक लेबल केवल एक बार मैं अगर यह इस मामले में यह करने के लिए एकमात्र कारण के बाद से बुरा व्यवहार माना जाता है सोच रहा था कहा जाता है सौंदर्य कारणों के लिए है। मैं तर्क दूंगा कि लेबल के साथ वर्तमान संस्करण स्पष्ट है लेकिन यह सामान्य ज्ञान के खिलाफ जा सकता है जिसे मैं नहीं जानता, लिस्प के लिए नया होना।

+1

यदि आपके कार्यों को एक-दूसरे (या स्वयं) को संदर्भित करने की आवश्यकता नहीं है, तो आप 'लेबल' के बजाय 'flet' का उपयोग कर सकते हैं। – Svante

+0

क्या कोड पढ़ने के लिए किसी और को अतिरिक्त जानकारी के बारे में जानकारी देने के अलावा ऐसा करने का कोई फायदा है? – asm

+0

शायद नहीं। हालांकि, याद रखें कि कोड को पढ़ने वाले अगले व्यक्ति के लिए आपको कोड लिखना चाहिए, कंपाइलर/दुभाषिया आपका प्राथमिक दर्शक नहीं है। – Vatine

उत्तर

7

नहीं, यह ठीक है। नामित फ़ंक्शंस लिखने से कोड थोड़ा और अधिक स्वयं-दस्तावेज़ और अधिक मॉड्यूलर बनाता है।

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

स्थानीय फ़ंक्शन स्थानीय दस्तावेज़ स्ट्रिंग और इंटरफ़ेस विवरण जोड़ने की संभावना भी प्रदान करते हैं।

यदि स्थानीय फ़ंक्शन बहुत बड़े हो रहे हैं और इन्हें बाहर भी इस्तेमाल किया जा सकता है, तो मैं उन्हें निकाल दूंगा और उन्हें वैश्विक बना दूंगा।

1

लिस्प नौसिखिया के अलावा कुछ भी नहीं है, मैं कहूंगा कि आप सही काम कर रहे हैं: नामकरण करके अपना कोड अधिक पठनीय बनाते हैं।

2

मुझे इसके साथ कुछ भी बुरा नहीं दिख रहा है। आप दो उपप्रोसेसेस को बहुत स्पष्ट और आसान करने के लिए आसान बना रहे हैं, जिससे शरीर को देखकर वास्तव में कार्य क्या करता है, इस पर त्वरित समझ प्राप्त करना आसान हो जाता है। यदि आपको आवश्यकता हो तो वैश्विक कार्यों में आंतरिक कार्यों को बढ़ावा देना अब भी आसान है।