2009-06-09 9 views
21

पीटर नॉर्विग Paradigms of Artificial Intelligence Programming में page 50 पर, विशिष्टता और स्थिरता के बीच व्यापार बंद करते हैं और जब किसी चर को चर को अद्यतन करने के लिए सेटक या सेटफ़ का उपयोग करना चुनते हैं। आप क्या सलाह देते हैं? क्या आपने कभी ऐसी परिस्थिति में भाग लिया है जहां यह पठनीयता से काफी अधिक है?लिस्प शैली: सेटक बनाम सेटफ

उत्तर

15

सेटक का उपयोग करना अधिक निम्न स्तर है, लेकिन setf का प्रदर्शन कोई समस्या नहीं है। और setf कस्टम डेटा संरचनाओं के हिस्सों को सेट करने जैसे कस्टम सेटफ़ व्यवहार प्रदान करने के लिए आपको (या लाइब्रेरी लेखकों) की अनुमति देता है। मैं कहता हूं: जब तक आपके पास कोई कारण न हो, तब तक सेटफ के साथ जाएं।

प्रैक्टिकल कॉमन लिस्प, अध्याय 3: यह भी देखें: "एसईटीएफ मैक्रो आम लिस्प का मुख्य असाइनमेंट ऑपरेटर है।" पीसीएल मुफ्त में ऑनलाइन उपलब्ध है: http://gigamonkeys.com/book/

9

आप का उपयोग कर सकते हैं जहां भी आप setq का उपयोग कर सकते हैं। वास्तव में, setf वास्तव में एक मैक्रो है जो setq पर बनाता है। तो, यह पूरी तरह से एक पठनीयता और शैली मुद्दा होना चाहिए।

लगभग सभी कोड जो मैंने देखा है setq के उपयोग से बचाता है और setf का उपयोग करता है।

1

मैं आपको उस अनुभाग में Norvig की अंतिम सलाह का पालन करने की सलाह देता हूं: सुसंगत रहें। 'पठनीयता' निश्चित रूप से प्रोग्रामिंग में कोई भी विकल्प बनाने का सबसे महत्वपूर्ण कारण है। यदि पाठक से संवाद करना महत्वपूर्ण है (शायद आप 2 महीने के समय में) कि आप एक प्रतीक के पूरे मूल्य सेल से निपट रहे हैं, तो setq का उपयोग करें; अन्यथा setf का उपयोग करें। लेकिन केवल अगर आप लगातार रहे हैं।

3

setf "सेट फ़ील्ड" है, यह जगह बदलता है और उपयोगकर्ता एक्सटेंशन हो सकता है। setq को पहले तर्क उद्धृत करने के साथ सेट किया गया है।

10

एफडब्ल्यूआईडब्ल्यू, मैं हमेशा setf का उपयोग करता हूं। अगर मैं अपने कोड की संरचना को थोड़ा बदलता हूं, तो मुझे बस जगह और ऑपरेटर (setq -> setf) के बजाय "स्थान" को बदलने की आवश्यकता है।

इसके अलावा, प्रदर्शन के बारे में चिंता मत करो, setf वास्तव में प्रतीकों के लिए setq रूप में ही है:

CL-USER> (macroexpand '(setf foo 42)) 
(SETQ FOO 42) 
-2

तुम गलत नहीं होगा यदि आप setq के बजाय हर जगह setf इस्तेमाल किया।

यह ऐसी चीजें हैं जो आम लिस्प को आगे बढ़ने से ड्रैग करती हैं, बहुत सारी अप्रयुक्त सामग्री जो कार्यान्वयन करने वालों को अभी भी समर्थन करने की आवश्यकता होती है।

+3

मैं दूसरी वाक्य पर ऑब्जेक्ट करता हूं। एसईटीएफ कई असाइनमेंट संरचनाओं पर एक सुविधाजनक अमूर्त है, जिसमें से एक एसईटीक्यू है। आप एसईटीक्यू के बिना एसईटीएफ लागू नहीं कर सकते हैं। – Svante

+0

2Svante: लेकिन ऐसी स्थितियों की कल्पना करना मुश्किल है जहां आपको setf के बजाय setq का उपयोग करने की आवश्यकता होगी। –

+5

यह बात नहीं है - कोई भी उच्च स्तर कोड में TAGBODY और GO का उपयोग नहीं करता है, लेकिन कई सामान्य संरचनाओं के कार्यान्वयन उन पर निर्भर करता है। – Svante

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