2009-08-22 12 views
11

आम लिस्प कंस सेल की परिभाषा वास्तव में क्या है? एक मानक सेल सूची मानक सूची आइटम से अलग कैसे है? आखिरकार, विपक्षी सेल और लिंक्ड सूची आइटम दोनों के पास अगले सेल या आइटम के लिए एक मूल्य और सूचक होता है ... या क्या यह समझ गलत है?लिस्प कंस सेल की परिभाषा क्या है?

+1

प्रत्येक सूची ('शून्य 'को छोड़कर) एक विपक्षी कोशिका है, लेकिन प्रत्येक विपक्षी सेल एक सूची नहीं है (यदि इसकी' सीडीआरआर सूची नहीं है) – mihi

+2

मैं सिर्फ यह स्पष्ट करना चाहता था कि मैं ऊपर एक सामान्य लिस्प के बीच तुलना कर रहा हूं सूची और इसके विपक्षी कोशिकाएं और एक नियमित लिस्केड सूची और उसके आइटम जैसे सी, सी ++ या जावा जैसी भाषा में कार्यान्वित किए गए हैं। –

उत्तर

19

आम तौर पर विपक्षी कोशिकाओं में दो पॉइंटर्स होते हैं जो कुछ भी इंगित कर सकते हैं। पाठ्यक्रम का सामान्य उपयोग बाएं एक के साथ "मूल्य", और "दाएं" के साथ एक अन्य विपक्ष सेल (या शून्य) को इंगित करना है।

+7

विपक्षी कोशिकाएं पॉइंटर्स धारण किए बिना सीधे मूल्यों को पकड़ सकती हैं। (विपक्ष 1 2) से बने एसी कंस सेल में संख्याओं के लिए पॉइंटर्स होंगे, लेकिन उन्हें सीधे स्टोर कर सकते हैं (कुछ अन्य छोटी वस्तुओं जैसे वर्णों के लिए)। –

+0

में संख्याओं के पॉइंटर्स नहीं होंगे, मेरा मतलब है –

13

एक विपक्षी सूची नोड से एक बाइनरी पेड़ नोड के करीब है। कार और सीडीआर दो बच्चों को वापस कर देते हैं, जो शून्य, परमाणु या अन्य विपक्षी कोशिकाएं हो सकती हैं।

+7

यहां भेद पर जोर देने के लिए, कोई आवश्यकता नहीं है कि दूसरा तत्व एक और विपक्ष सेल होना चाहिए। '('tofu। 1)' एक मान्य विपक्ष सेल है। – Chuck

7

लिस्प में, एक विपक्ष सेल में मूल्यों की एक जोड़ी होती है। यदि विपक्ष सेल c परिवर्तनीय में है, तो (car c) पहला मान देता है और (cdr c) दूसरा देता है।

सम्मेलन के अनुसार, एक सूची में विपक्षी कोशिकाएं होती हैं जहां सेल के car में नोड मान होता है और cdr में सूची के अंत को इंगित करने के लिए अगले नोड या शून्य (खाली सूची) का संदर्भ होता है। जब आदिम कार्य सूचियों को वापस या स्वीकार करते हैं, यह वह प्रारूप है जिसमें सूची प्रस्तुत की जाती है।

इसलिए, सूची l के लिए, (car l) पहला तत्व (पहले विपक्ष सेल में मूल्य) और (cdr l) रिटर्न सूची की पूंछ (सूची में अगले विपक्ष सेल) देता है।

3

मुझे लगता है कि यहां अन्य उत्तरों, सटीक होने पर, एक चीज़ के बारे में स्पष्ट नहीं हैं।

एक पारंपरिक सी ++ लिंक्ड सूची कार्यान्वयन में, दो क्षेत्रों (val और next, कहते हैं) टाइप किया हैं। next को सूची में किसी अन्य नोड को इंगित करने के रूप में परिभाषित किया गया है, null टर्मिनेटर होने के साथ। आप पर कुछ भी इंगित नहीं कर सकते हैं लेकिनnext के साथ एक और नोड।

लिप्स गतिशील रूप से टाइप किए गए हैं, इसलिए या तो एक विपक्ष सेल में क्षेत्र कुछ भी (या तो परमाणु या संदर्भ) हो सकता है। आप विपक्षी कोशिकाओं के साथ एक लिंक्ड सूची को कार्यान्वित कर सकते हैं (यह सब एक लिस्प सूची है: nil टर्मिनेटर के साथ विपक्षी कोशिकाओं की एक श्रृंखला), लेकिन आप प्रत्येक क्षेत्र में मनमाना मूल्य भी डाल सकते हैं, एक कॉन्स सेल का उपयोग समन्वय जोड़ी के रूप में करते हैं, एक पेड़ नोड, आदि

आप इन्हें भी जोड़ सकते हैं; उदाहरण के लिए, xy की एक सूची निर्देशांक:

;; (cons foo (cons bar nil)) == (list foo bar)  
(cons 
    (cons 5 4) 
    (cons (cons 9 10) nil)) 
=> 
((5 . 4) (9 . 10)) 

एक विपक्ष सेल इस प्रकार सख्ती से एक लिंक्ड सूची नोड से अधिक सामान्य है, यह बोलने के लिए "लागू जोड़ी" के करीब है। मानक सूची प्रसंस्करण कार्य (map, dolist, आदि) के सभी बस में कार्य करता है कि मान आप car में मूल्यों डाल रहे हैं और cdr में एक और सूची है।

इस सब का मतलब है कि - अगर आप की कामना की - आप सूचियों पीछे की ओरcar अगले विपक्ष सेल की ओर इशारा करते और cdr मूल्य की ओर इशारा करते के साथ निर्धारित कर सकते हैं,! एक लिंक किए गए सूची नोड के साथ ऐसा करने के लिए आपको प्रकारों को बदलने के लिए कक्षा या डेटा संरचना को फिर से परिभाषित करना होगा।

4

एक cons सेल, cons, car से मिलकर एक अनुबंध का एक तिहाई, और cdr है आवश्यकता जा रहा है कि वे, जोड़े के रूप में व्यवहार के रूप में दूसरों का उल्लेख किया है के साथ।

इस परिभाषा से "संदर्भ", "सूचक" इत्यादि को छोड़ने का कारण यह पहचानना है कि वे कार्यान्वयन विवरण हैं। आप के लिए, आप एक cons हवा से बाहर का निर्माण कर सकते Abelson के रूप में, चाहता था और Sussman किया है:

(define (cons a b) (lambda (x) (x a b))) 
(define (car x) (x (lambda (a b) a))) 
(define (cdr x) (x (lambda (a b) b))) 

इस परिभाषा परिभाषाएँ और कार्यों का लिस्प की दुनिया के अंदर पूरी तरह से रहता है, और यहां तक ​​कि ध्यान में रखना आवश्यक नहीं रुकती वस्तुओं को मान या संदर्भ के रूप में संग्रहीत किया जाता है; फिर भी ये आदिम वस्तुओं के लिए ड्रॉप-इन प्रतिस्थापन के रूप में कार्य कर सकते हैं (उत्परिवर्तन या अन्य विशेष उपयोगों पर विचार नहीं कर रहे हैं)।

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