2012-03-21 8 views
13

अब यह सिर्फ ठीक काम करता है:elisp: कैसे स्ट्रिंग कुंजी के साथ एक संघ सूची में से एक तत्व को नष्ट करने के

(setq al '((a . "1") (b . "2"))) 
(assq-delete-all 'a al) 

लेकिन मैं अपने अनुप्रयोग में कुंजी के रूप में तार का उपयोग कर रहा:

(setq al '(("a" . "foo") ("b" . "bar"))) 

और इस लिए कुछ भी करने में विफल रहता है:

(assq-delete-all "a" al) 

मुझे लगता है कि क्योंकि स्ट्रिंग वस्तु दृष्टान्त अलग है कि

012 (?)

तो मैं कैसे एक संघ सूची में से एक स्ट्रिंग कुंजी के साथ एक तत्व को नष्ट करना चाहिए? या मुझे छोड़ देना चाहिए और इसके बजाय प्रतीकों का उपयोग कुंजी के रूप में करना चाहिए, और आवश्यकता होने पर उन्हें तारों में परिवर्तित करना चाहिए?

+1

वैसे, आप 'वापस चर हालांकि यह एक विनाशकारी आपरेशन है assq-हटाना-all' का परिणाम आवंटित करने के लिए की जरूरत है:' (setq अल (assq हटाना-सब 'एक अल)) '। अगर सूची खाली हो जाती है तो क्या होगा? 'अल' को मूल्य शून्य पर लेना चाहिए: यह कैसे होगा? या क्या होगा यदि आप पहले तत्व को हटा देते हैं, तो मुख्य विपक्ष जिसमें 'al' प्रारंभ में इंगित करता है?दूसरे सेल पर जाने के लिए 'al' को अद्यतन किया जाना चाहिए। – Kaz

उत्तर

11

क्या आप जानते हैं वहाँ केवल अपनी सूची में एक भी मिलान प्रवेश किया जा सकता है, तो आप भी निम्नलिखित फार्म का उपयोग कर सकते हैं:

(setq al (delq (assoc <string> al) al) 

सूचना है कि setq (जो आपके नमूना कोड से लापता था) बहुत महत्वपूर्ण है सूचियों पर 'हटाएं' संचालन के लिए, अन्यथा ऑपरेशन विफल रहता है जब हटाया गया तत्व सूची में पहला होता है।

13

qassq पारंपरिक रूप से eq वस्तुओं के लिए समानता का उपयोग किया जाता है।

दूसरे शब्दों में, assqeq स्वाद assoc है।

स्ट्रिंग्स eq समानता का पालन नहीं करते। समकक्ष वर्ण अनुक्रमों के दो तार eq नहीं हो सकते हैं। assoc Emacs लिस्प में equal समानता जो तार के साथ काम करता उपयोग करता है।

तो आपको अपनी equal-आधारित एसोसिएशन सूची के लिए assoc-delete-all है, लेकिन यह फ़ंक्शन मौजूद नहीं है। http://lists.gnu.org/archive/html/emacs-devel/2005-07/msg00169.html

रोल अपनी खुद की:

सभी जब मैं assoc-delete-all के लिए खोज मैं पा सकते हैं इस मेलिंग सूची धागा है। यह काफी तुच्छ है: आप डाउन सूची मार्च, और एक नई सूची जिसका carequal के तहत दिए गए कुंजी से मेल नहीं खाता में उन सभी प्रविष्टियों को इकट्ठा। को देखने के लिए

एक उपयोगी चीज कॉमन लिस्प संगतता पुस्तकालय हो सकता है। http://www.gnu.org/software/emacs/manual/html_node/cl/index.html

वहाँ कुछ उपयोगी कार्य हैं, जैसे remove*, जिसके साथ आप तत्वों का परीक्षण करने के लिए कस्टम अनुमानित फ़ंक्शन वाली सूची से हटा सकते हैं। इसी के साथ आप कुछ इस तरह कर सकते हैं:

;; remove "a" from al, using equal as the test, applied to the car of each element 
(setq al (remove* "a" al :test 'equal :key 'car)) 

विनाशकारी संस्करण delete* है।

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