2013-07-18 5 views
5

मुझे आम-लिस्प में यह पहली/आखिरी चीज़ नहीं मिल रही है। हां, मैं देखता हूं कि यह कैसे काम करता है, लेकिन मुझे नहीं लगता कि यह इस तरह से क्यों काम करता है।आम लिस्प: पहले पहले लौटाता है, लेकिन अंतिम आखिरी बार एक सूची देता है - हुह?

असल में, सूची में पहला आइटम प्राप्त करने के लिए, मैं (first mylist) का उपयोग कर सकता हूं। हालांकि, अगर मैं अंतिम आइटम चाहता हूं, (last mylist) मुझे वह नहीं देता है; इसके बजाय, यह मुझे मेरी सूची में अंतिम आइटम वाली एक सूची देता है!

(मैं क्लोजर-सीएल का उपयोग कर रहा हूं, जिसमें कुछ अन्य विषमताएं हैं जो मुझे बग की तरह लगती हैं, लेकिन चूंकि मैं लिस्प-एन 00 बी हूं, इसलिए मैं पुराने के लिए गिरने की कोशिश नहीं कर रहा हूं "दुभाषिया है ब्रोकन "चाल :))

तो, उदाहरण के लिए:

? (setq x '((1 2) (a b))) 
=> ((1 2) (A B)) 

? (first x) 
=> (1 2) ; as expected 

? (last x) 
=> ((A B)) ; why a list with my answer in it?! 

? (first (last x)) 
=> '(A B) ; This is the answer I'd expect from plain-old (last x) 

किसी की मदद कर सकते हैं मुझे समझने क्यों पिछले इस करता है? क्या मैं इन वस्तुओं का गलत इस्तेमाल कर रहा हूं? first वास्तव में अजीब गेंद है ?!

धन्यवाद!

+0

'(' (1 2) '(ए बी) करना) वास्तव में आपके मतलब का मतलब नहीं है, मुझे लगता है। '((1 2) (बी)) का प्रयोग करें। जो आपने लिखा वह सूची के बाद बनाता है: (उद्धरण (1 2)) (उद्धरण (बी)))। यहां दो 'उद्धरणों का अर्थ उस विशेष ऑपरेटर के रूप में नहीं किया गया है जिसका आप संभवतः मतलब रखते थे, लेकिन केवल सादे पुराने प्रतीक हैं जो समान नाम रखते हैं। यह देखने के लिए कि मेरा क्या मूल्यांकन है (पहले (पहले '(' (1 2) '(ए बी)))) आपके आरईपीएल में। इसे QUOTE वापस करना चाहिए। –

+0

थॉमस: आप सही हैं। स्रोत संपादित – Olie

उत्तर

8

कॉमन लिस्प last में एक सूची वापस करने के लिए माना जाता है, documentation से:

last list &optional n => tail 
list---a list, which might be a dotted list but must not be a circular list. 
n---a non-negative integer. The default is 1. 
tail---an object. 

पिछले रिटर्न पिछले n conses सूची के (नहीं पिछले n तत्वों)। अगर सूची है(), अंतिम रिटर्न()।

उदाहरण के लिए:

(setq x (list 'a 'b 'c 'd)) 
(last x) => (d) 

और हाँ, यह counterintuitive है। लिस्प के अन्य जायके में यह (एक योजना बोली) रैकेट में काम करता है जैसा कि नाम से पता चलता है, उदाहरण के लिए:

(define x '((1 2) (a b))) 
(first x) => '(1 2) 
(last x) => '(a b) 

(define x (list 'a 'b 'c 'd)) 
(last x) => 'd 
+1

अन्य उदाहरणों के लिए ठीक है, स्वीकार किया गया है, और धन्यवाद। मैं बस यह सुनिश्चित करना चाहता था कि मैं कुछ महत्वपूर्ण बिंदुओं को पूरी तरह से याद नहीं कर रहा था, क्योंकि पहली/आखिरी मेलसमूह शेष भाषा की तुलना में इतनी सुन्दर दिखती है (हालांकि [एफ]/सेट [एफ] प्राप्त करने के बारे में काज़ का बिंदु बहुत मजेदार है, भी :)) – Olie

4

कॉमन लिस्प के misnamed समारोह last आप पिछले विपक्ष देता है।

इसे tail कहा जाना चाहिए, क्योंकि tailp कोई फ़ंक्शन है, लेकिन मेरा अनुमान यह है कि यह नाम ऐतिहासिक/संगतता कारणों से फंस गया है।

आम तौर पर, यह आप एक सूची के वें पूंछ, या सूची के अंत से पहले वें विपक्ष देता है।

4

यह वही तरीका है। first और last संचालन की एक पूरक जोड़ी नहीं हैं। lastrest और nthcdr से अधिक निकटता से संबंधित है। butlast भी है जो एक नई सूची बनाता है जो दी गई सूची से अंतिम आइटम को छोड़ देता है।

first बनाम last के लिए कैसे get और getfset और setf कोई लेना देना नहीं है की तुलना में कुछ भी नहीं है।

+0

एलओएल: पहले बनाम अंतिम <=> प्राप्त करें [एफ] बनाम सेट [एफ] - हाँ! ऐसा लगता है कि उन्होंने जानबूझकर n00bs के सिर के साथ गड़बड़ कर दी! – Olie

6

अंतिम तत्व को लौटने के अलावा अंतिम तत्व को लौटने के अलावा बहुत उपयोगी नहीं है; पिछले विपक्ष लौटने आप कुछ इस तरह कर सकते हैं:

(let ((x (list 1 2 3))) 
    (setf (cdr (last x)) '(4)) 
    x) 

=> '(1 2 3 4) 

आप अभी भी (car (last x)) के रूप में पिछले तत्व का उपयोग कर सकते है।

+0

ठीक है, यह उपयोगी है। मुझे लगता है कि मैं सिर्फ यह सत्यापित करना चाहता था कि मैं नाव को पूरी तरह से याद नहीं कर रहा था, क्योंकि ऐसा लगता है कि ** ** ** प्रतिद्वंद्वी है कि पहले/आखिरी मेलिंग जोड़ी नहीं है। – Olie

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