मैं सोच रहा था कि लिस्प में लेबल के उपयोग के संबंध में मानक अभ्यास है या नहीं। मैं 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))))))
के बाद से प्रत्येक लेबल केवल एक बार मैं अगर यह इस मामले में यह करने के लिए एकमात्र कारण के बाद से बुरा व्यवहार माना जाता है सोच रहा था कहा जाता है सौंदर्य कारणों के लिए है। मैं तर्क दूंगा कि लेबल के साथ वर्तमान संस्करण स्पष्ट है लेकिन यह सामान्य ज्ञान के खिलाफ जा सकता है जिसे मैं नहीं जानता, लिस्प के लिए नया होना।
यदि आपके कार्यों को एक-दूसरे (या स्वयं) को संदर्भित करने की आवश्यकता नहीं है, तो आप 'लेबल' के बजाय 'flet' का उपयोग कर सकते हैं। – Svante
क्या कोड पढ़ने के लिए किसी और को अतिरिक्त जानकारी के बारे में जानकारी देने के अलावा ऐसा करने का कोई फायदा है? – asm
शायद नहीं। हालांकि, याद रखें कि कोड को पढ़ने वाले अगले व्यक्ति के लिए आपको कोड लिखना चाहिए, कंपाइलर/दुभाषिया आपका प्राथमिक दर्शक नहीं है। – Vatine