2013-05-04 6 views
5
(define .. 
    (lambda (start stop) 
    (cond ((> (add1 start) stop) (quote())) 
      ((eq? (add1 start) stop) (sub1 stop)) 
      (else (cons start (.. (add1 start) stop)))))) 

मैंने एक साधारण श्रेणी समारोह परिभाषित किया है। आशय के लिएलिस्प में रिकर्सिव रेंज एक अवधि जोड़ती है?

(.. 1 5) --> (1 2 3 4) 

इसके बजाय, एक विचित्र अवधि मेरी टपल जोड़ा जा रहा है और मुझे पता नहीं क्यों है:

(.. 1 5) --> (1 2 3 . 4) 

मुझे समझ नहीं आता क्यों यह हो रहा है। किसी भी मदद की सराहना की

+0

जब आप '(.. 1 2)' करते हैं तो 'cond' में कौन सा मामला उपयोग किया जाता है? यह वापस क्या करता है? – Barmar

उत्तर

15

योजना में सूची या तो खाली सूची () (भी कुछ Lisps में nil रूप में जाना जाता है), या एक विपक्ष सेल जिसका car (भी first के रूप में जाना जाता है) सूची का एक तत्व है और जिसका cdr (है rest के रूप में भी जाना जाता है) या तो शेष सूची (यानी, एक और सूची) है, या एक परमाणु जो सूची को समाप्त करता है। पारंपरिक टर्मिनेटर खाली सूची () है; () द्वारा समाप्त की गई सूचियों को "उचित सूचियां" कहा जाता है। किसी अन्य परमाणु द्वारा समाप्त सूची को "अनुचित सूची" कहा जाता है। सूची (1 2 3 4 5) में तत्व 1, 2, 3, 4, और 5 शामिल हैं, और () द्वारा समाप्त किया गया है। आप अब, जब प्रणाली प्रिंट एक विपक्ष सेल, सामान्य स्थिति से

(car . cdr) 

उदाहरण के लिए यह मुद्रित करने के लिए है

(cons 1 (cons 2 (cons 3 (cons 4 (cons 5()))))) 

द्वारा यह निर्माण कर सकता है, (cons 1 2) का परिणाम

के रूप में मुद्रित किया जाता है
(1 . 2) 

चूंकि सूचियां सेल कोशिकाओं से बनी हैं, इसलिए आप सूचियों के लिए भी इस नोटेशन का उपयोग कर सकते हैं:

'(1 2 3 4 5) == 
'(1 . (2 . (3 . (4 . (5 .()))))) 

यही कारण है, बल्कि भद्दा हालांकि, इसलिए अधिकांश lisps (सभी है कि मैं के बारे में पता) विपक्ष कोशिकाओं मुद्रण के लिए किसी विशेष परिस्थिति में: अगर cdr एक सूची (या तो एक और विपक्ष सेल, या ()) है, तो डॉन ' . मुद्रित करें, और cdr के आस-पास के कोष्ठक को प्रिंट न करें (जो अन्यथा होगा, क्योंकि यह एक सूची है)। तो, अगर आप की तरह

(1 2 3 . 4) 

एक परिणाम देख रहे हैं तो यह आपको एक अनुचित सूची है कि परमाणु 4 से समाप्त हो जाता है मिल गया है इसका मतलब है। इसकी संरचना

(1 . (2 . (3 . 4))) 

अब सवाल यह है: आपके कोड में सूची निर्माण कब घबरा गया था?पहला मामला हमेशा एक उचित सूची (खाली सूची) देता है:

((> (add1 start) stop) (quote())) 

दूसरे मामले की तरह यह कुछ है कि एक नहीं है लौट सकते हैं लग रहा है .. हमेशा एक उचित सूची वापस जाने के लिए है, तो के मामलों को देखते हैं माना जाता है सूची (यह मानते हुए (sub1 stop) == (- stop 1) कि):

((eq? (add1 start) stop) (sub1 stop)) 

अब, अगर .. सही ढंग से कार्य कर रहे थे, तो तीसरे मामले हमेशा एक उचित सूची लौट रहा होगा ((cons x y) के बाद से एक उचित सूची अगर y है):

(else (cons start (.. (add1 start) stop))) 

अपना दूसरा मामला एक सूची लौटाएं और आपको पूरा सेट होना चाहिए।

+0

आपकी सलाह के लिए धन्यवाद - स्पष्टीकरण स्पष्ट और समझने में आसान था। – vim

1

आपका अभिव्यक्ति (sub1 stop)cons के लिए (list (sub1 stop))

को पढ़ने के लिए आदेश में एक उचित सूची का निर्माण करने की जरूरत है, दूसरा तत्व एक ही सूची की जरूरत है। इस प्रकार, आपके फ़ंक्शन .. को प्रत्येक cond खंड के लिए कुछ प्रकार की एक सूची वापस करनी चाहिए।

1

निकालें cond

((eq? (add1 start) stop) (sub1 stop)) 

यह एक समय से पहले खत्म पैदा के इस हिस्से।

+0

+1। थोड़ा ही काफी है !!! :) :) –

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