पीटर नॉर्विग Paradigms of Artificial Intelligence Programming में page 50 पर, विशिष्टता और स्थिरता के बीच व्यापार बंद करते हैं और जब किसी चर को चर को अद्यतन करने के लिए सेटक या सेटफ़ का उपयोग करना चुनते हैं। आप क्या सलाह देते हैं? क्या आपने कभी ऐसी परिस्थिति में भाग लिया है जहां यह पठनीयता से काफी अधिक है?लिस्प शैली: सेटक बनाम सेटफ
उत्तर
सेटक का उपयोग करना अधिक निम्न स्तर है, लेकिन setf का प्रदर्शन कोई समस्या नहीं है। और setf कस्टम डेटा संरचनाओं के हिस्सों को सेट करने जैसे कस्टम सेटफ़ व्यवहार प्रदान करने के लिए आपको (या लाइब्रेरी लेखकों) की अनुमति देता है। मैं कहता हूं: जब तक आपके पास कोई कारण न हो, तब तक सेटफ के साथ जाएं।
प्रैक्टिकल कॉमन लिस्प, अध्याय 3: यह भी देखें: "एसईटीएफ मैक्रो आम लिस्प का मुख्य असाइनमेंट ऑपरेटर है।" पीसीएल मुफ्त में ऑनलाइन उपलब्ध है: http://gigamonkeys.com/book/
आप का उपयोग कर सकते हैं जहां भी आप setq
का उपयोग कर सकते हैं। वास्तव में, setf
वास्तव में एक मैक्रो है जो setq
पर बनाता है। तो, यह पूरी तरह से एक पठनीयता और शैली मुद्दा होना चाहिए।
लगभग सभी कोड जो मैंने देखा है setq
के उपयोग से बचाता है और setf
का उपयोग करता है।
मैं आपको उस अनुभाग में Norvig की अंतिम सलाह का पालन करने की सलाह देता हूं: सुसंगत रहें। 'पठनीयता' निश्चित रूप से प्रोग्रामिंग में कोई भी विकल्प बनाने का सबसे महत्वपूर्ण कारण है। यदि पाठक से संवाद करना महत्वपूर्ण है (शायद आप 2 महीने के समय में) कि आप एक प्रतीक के पूरे मूल्य सेल से निपट रहे हैं, तो setq
का उपयोग करें; अन्यथा setf
का उपयोग करें। लेकिन केवल अगर आप लगातार रहे हैं।
setf "सेट फ़ील्ड" है, यह जगह बदलता है और उपयोगकर्ता एक्सटेंशन हो सकता है। setq को पहले तर्क उद्धृत करने के साथ सेट किया गया है।
एफडब्ल्यूआईडब्ल्यू, मैं हमेशा setf
का उपयोग करता हूं। अगर मैं अपने कोड की संरचना को थोड़ा बदलता हूं, तो मुझे बस जगह और ऑपरेटर (setq -> setf) के बजाय "स्थान" को बदलने की आवश्यकता है।
इसके अलावा, प्रदर्शन के बारे में चिंता मत करो, setf वास्तव में प्रतीकों के लिए setq रूप में ही है:
CL-USER> (macroexpand '(setf foo 42))
(SETQ FOO 42)
तुम गलत नहीं होगा यदि आप setq के बजाय हर जगह setf इस्तेमाल किया।
यह ऐसी चीजें हैं जो आम लिस्प को आगे बढ़ने से ड्रैग करती हैं, बहुत सारी अप्रयुक्त सामग्री जो कार्यान्वयन करने वालों को अभी भी समर्थन करने की आवश्यकता होती है।
- 1. डिफवर, डिफपरमीटर, सेटफ और सेटक
- 2. लिस्प में सेटक और डिफवर
- 3. सामान्य लिस्प
- 4. लिस्प: मैक्रोज़ बनाम कार्य
- 5. लिस्प बनाम अजगर - स्टेटिक संकलन
- 6. स्मॉलटॉक-शैली संदेश बनाम सी-शैली कार्य
- 7. आर लेखन शैली - बनाम ::
- 8. कॉमन लिस्प स्कोपिंग (गतिशील बनाम लेक्सिकल)
- 9. major.minor.build.revision संस्करण शैली बनाम वर्ष .month.day.whatever संस्करण शैली
- 10. लिस्प
- 11. लिस्प
- 12. लिस्प
- 13. लिस्प
- 14. लिस्प
- 15. लिस्प
- 16. लिस्प
- 17. लिस्प
- 18. लिस्प
- 19. लिस्प
- 20. लिस्प
- 21. लिस्प
- 22. लिस्प
- 23. आम लिस्प एक लिस्प-एन?
- 24. जावा कोड शैली - इंटरफेस बनाम सार कक्षाएं
- 25. शैली में एक अंतर: IDictionary बनाम शब्दकोश
- 26. पायथन शैली: यदि बयान बनाम बूलियन मूल्यांकन
- 27. फ़ॉन्ट शैली: सीएसएस में इटालिक बनाम oblique
- 28. सी ++ स्ट्रीम बनाम सी-शैली आईओ?
- 29. स्कैला प्रदर्शन: अनिवार्य बनाम कार्यात्मक शैली
- 30. एफ # कोडिंग शैली - स्थैतिक बनाम उदाहरण विधियां
मैं दूसरी वाक्य पर ऑब्जेक्ट करता हूं। एसईटीएफ कई असाइनमेंट संरचनाओं पर एक सुविधाजनक अमूर्त है, जिसमें से एक एसईटीक्यू है। आप एसईटीक्यू के बिना एसईटीएफ लागू नहीं कर सकते हैं। – Svante
2Svante: लेकिन ऐसी स्थितियों की कल्पना करना मुश्किल है जहां आपको setf के बजाय setq का उपयोग करने की आवश्यकता होगी। –
यह बात नहीं है - कोई भी उच्च स्तर कोड में TAGBODY और GO का उपयोग नहीं करता है, लेकिन कई सामान्य संरचनाओं के कार्यान्वयन उन पर निर्भर करता है। – Svante