2010-11-11 12 views
13

मैं "लिस्प ऑफ़ लैंड" पढ़ रहा हूं (जिस तरह से, मैंने कभी भी पढ़ी गई सबसे अच्छी तकनीकी किताबों में से एक है) और मैं एसोसिएशन सूचीलिस्प में एसोसिएशन सूची के बारे में मूल प्रश्न

 (defparameter *edges* 
    '((living-room (garden west door) 
        (attic upstairs ladder)) 
     (garden (living-room east door)) 
     (attic (living-room downstairs ladder)))) 

पहले आया हूं, लिस्प में एसोसिएशन सूची है जावा के मानचित्र (कुंजी-मूल्य बाध्यकारी) की एक ही अवधारणा?
रहने वाले कमरे की कुंजी के लिए, एक से अधिक मूल्य होने के लिए कैसे संभव है? एक सूची के साथ मूल्य को संलग्न न करें:

 (living-room ((garden west door) (attic upstairs ladder))) 

उत्तर

13
  1. हाँ, संघ सूची एक तरह से मुख्य मान संघों व्यक्त करने के लिए है। अन्य संरचनाएं आम लिस्प उस संपत्ति को सूचियां और हैश टेबल प्रदान करती हैं।

  2. मूल्य वास्तव में पहले से ही एक सूची में निहित है। एक अलगाव मूल रूप से जोड़ों की एक सूची है, जहां प्रत्येक जोड़ी की कार कुंजी है, और सीडीआर उस कुंजी से जुड़ा मूल्य है। आप ASSOC के साथ महत्वपूर्ण बैठक-कक्ष को देखने और परिणाम के लिए सीडीआर लागू होते हैं:

CL-USER> (cdr (assoc 'living-room *edges*)) 
((GARDEN WEST DOOR) (ATTIC UPSTAIRS LADDER)) 

इसके पीछे जादू तथ्य यह है कि एक जोड़ी जिसका कार living-room और जिसका सीडीआर की एक सूची है में निहित है दो तत्व (garden west door) और (attic upstairs ladder) को जोड़ों से सूचियों के तरीके के कारण, तीन-तत्व सूची (living-room (garden west door) (attic upstairs ladder)) के रूप में भी देखा जा सकता है।

आमतौर पर जब उद्धृत वस्तुओं के रूप में alists का प्रतिनिधित्व करने के लिए, आप तत्वों बिंदीदार जोड़े के साथ स्पष्ट रूप से दिखाया गया बल्कि सूची अंकन के साथ punning से देखते हैं, है, तो जैसे:

 
(defparameter *edges* 
    '((living-room . ((garden west door) 
        (attic upstairs ladder))) 
    (garden . ((living-room east door))) 
    (attic . ((living-room downstairs ladder))))) 
+0

आह, कुछ ही मिनटों के द्वारा इसे करने के लिए मुझे हरा! हां, बिंदीदार जोड़ी सिंटैक्स का उपयोग न करने के लिए मुझे एक लूप के लिए भी फेंक दिया, एक दूसरे के लिए - अच्छा अवलोकन! – Ken

+0

यदि मैं मूल्य प्राप्त करना चाहता हूं, तो मुझे सीडीआर क्यों करना है? assoc मूल्य प्राप्त करने के लिए माना जाता है, है ना? – Chiron

+2

एएसएसओसी आपको * रिकॉर्ड * प्राप्त करता है। कुंजी/मूल्य प्राप्त करने के लिए आपको फिर सीएआर या सीडीआर की आवश्यकता है। –

1

पहले, लिस्प ही में संघ सूची है जावा के मानचित्र की अवधारणा (कुंजी-मूल्य बाध्यकारी)?

जावा का नक्शा एक इंटरफेस है। एक एलिस्ट कुंजी-मूल्य जोड़े को स्टोर करने के लिए एक (लिंक) सूची का उपयोग करने का एक विशिष्ट तरीका है। मुझे नहीं लगता कि जावा में कोई भी अंतर्निहित मैप्स है जिसमें समानता के समान गुण हैं, लेकिन इसे लिखना मुश्किल नहीं होगा। चूंकि एक सूची एक सूची है, इसलिए सभी कार्यों और सूचियों के गुण अभी भी हैं।

रहने वाले कमरे की कुंजी के लिए, एक से अधिक मूल्य होने के लिए कैसे संभव है? क्यों एक सूची के साथ मूल्य संलग्न नहीं है:

एक एलिस्ट लिस्प वाक्यविन्यास का हिस्सा नहीं है। यह सिर्फ एक सूची है, इसलिए आप प्रत्येक तत्व के सीडीआर में जो कुछ भी चाहते हैं उसे डाल सकते हैं। इस मामले में, यह एक और कंस सेल है। ASSOC बस प्रत्येक तत्व की कार को देखता है।

(assoc 'living-room *edges*) 
(LIVING-ROOM (GARDEN WEST DOOR) (ATTIC UPSTAIRS LADDER)) 
1

एक एसोसिएशन सूची एक मानचित्र के लिए अवधारणा में समान है, दोनों मूल्यों के साथ सहयोगी कुंजी के रूप में।

किसी अन्य सूची में एकाधिक मान संलग्न करने की आवश्यकता नहीं है, क्योंकि इससे मूल्य का अर्थ बदल जाता है।मैं इस पुस्तक से परिचित नहीं हूँ, लेकिन ऐसा लगता है कि जिस तरह से है कि *EDGES* परिभाषित किया गया है, लेखक

(cdr (assoc 'Foobar *edges*)) 

स्थानों है कि आप Foobar से प्राप्त कर सकते हैं की एक सूची बनना चाहता है। परिभाषित के रूप में, यह सच है अगर एकल या एकाधिक मान हैं।

यदि, कई मान थे, तो आपने उन मानों को किसी अन्य सूची में घोंसला दिया, तो आपको उन्हें उस सूची से बाहर ले जाना होगा जब आप उनका उपयोग करना चाहते थे। यह आपको कुछ भी नहीं देगा, और यह एकल मूल्य मामले से अलग होगा।

5

एएसएसओसी विपक्षी सेल लौटाता है और इस प्रकार दोनों कुंजी और मूल्य शामिल होते हैं।

कारण यह है कि इससे मूल्य (या कुंजी) को विनाशकारी रूप से अपडेट करना आसान हो जाता है।

यहाँ अद्यतन SETF के पीछे छिपा है:

CL-USER 11 > (defparameter *edges* 
       (copy-tree 
       '((living-room (garden west door) 
           (attic upstairs ladder)) 
        (garden (living-room east door)) 
        (attic (living-room downstairs ladder))))) 
*EDGES* 

CL-USER 12 > (assoc 'living-room *edges*) 
(LIVING-ROOM (GARDEN WEST DOOR) (ATTIC UPSTAIRS LADDER)) 

CL-USER 13 > (cdr (assoc 'living-room *edges*)) 
((GARDEN WEST DOOR) (ATTIC UPSTAIRS LADDER)) 

CL-USER 14 > (setf (cdr (assoc 'living-room *edges*)) '((garden east door))) 
((GARDEN EAST DOOR)) 

CL-USER 15 > (cdr (assoc 'living-room *edges*)) 
((GARDEN EAST DOOR)) 
संबंधित मुद्दे