common-lisp
सूचियों के प्रकार
खोज…
सादा सूची
कॉमन लिस्प में प्लेन सूचियाँ सबसे सरल प्रकार की सूची हैं। वे तत्वों का एक क्रमबद्ध क्रम हैं। वे बुनियादी कार्यों का समर्थन करते हैं जैसे किसी सूची का पहला तत्व और निरंतर समय में सूची का बाकी हिस्सा, रैखिक समय में यादृच्छिक पहुंच का समर्थन करते हैं।
(list 1 2 3)
;=> (1 2 3)
(first (list 1 2 3))
;=> 1
(rest (list 1 2 3))
;=> (2 3)
ऐसे कई कार्य हैं जो "सादे" सूचियों पर काम करते हैं, इनफ़ॉफ़र क्योंकि वे केवल सूची के तत्वों की परवाह करते हैं। इनमें खोज , मैपकार और कई अन्य शामिल हैं। (इनमें से कई कार्य 17.1 अनुक्रम कार्य भी होंगे इनमें से कुछ कार्यों के लिए।
एसोसिएशन सूची
तत्वों की एक अनुक्रम का प्रतिनिधित्व करने के लिए सादा सूची उपयोगी होती है, लेकिन कभी-कभी मूल्य मैपिंग के लिए एक प्रकार की कुंजी का प्रतिनिधित्व करना अधिक सहायक होता है। कॉमन लिस्प इसे करने के कई तरीके प्रदान करता है, जिसमें वास्तविक हैश टेबल्स (देखें 18.1 हैश टेबल कॉन्सेप्ट )। आम लिस्प में दो प्राथमिक तरीके या मूल्य मैपिंग की कुंजी का प्रतिनिधित्व कर रहे हैं: संपत्ति सूची और एसोसिएशन सूची । यह उदाहरण एसोसिएशन सूचियों का वर्णन करता है।
एक एसोसिएशन सूची, या एलिस्ट एक "प्लेन" सूची है, जिनके तत्व डॉटेड जोड़े हैं, जिनमें प्रत्येक जोड़ी की कार की कुंजी है और प्रत्येक जोड़े की सीडीआर संबंधित मूल्य है। उदाहरण के लिए,
(defparameter *ages* (list (cons 'john 34) (cons 'mary 23) (cons 'tim 72)))
एक संघ सूची के रूप में माना जा सकता है जो एक पूर्णांक के साथ एक व्यक्तिगत नाम का संकेत देने वाले प्रतीकों को दर्शाता है जो उम्र को दर्शाता है। सदस्य जैसे सादे सूची कार्यों का उपयोग करके कुछ पुनर्प्राप्ति कार्यों को लागू करना संभव है। उदाहरण के लिए, जॉन की उम्र को पुनः प्राप्त करने के लिए, कोई भी लिख सकता है
(cdr (first (member 'mary *age* :key 'car)))
;=> 23
सदस्य फ़ंक्शन एक सामान्य सेल से शुरू होने वाली सूची की पूंछ लौटाता है, जिसकी कार mary है, ((mary। 23) (tim। 72)) , पहले उस सूची का पहला तत्व देता है, जो (mary) है। 23) , और cdr उस जोड़ी के दाईं ओर देता है, जो 23 है । हालांकि यह एक एसोसिएशन सूची में मूल्यों तक पहुंचने का एक तरीका है, एसोसिएशन सूचियों जैसे एक सम्मेलन का उद्देश्य अंतर्निहित प्रतिनिधित्व (एक सूची) से दूर रहना और डेटा संरचना के साथ काम करने के लिए उच्च-स्तरीय फ़ंक्शन प्रदान करना है।
संघ सूचियों के लिए, पुनः प्राप्ति समारोह है Assoc है, जो एक प्रमुख, एक संघ सूची और वैकल्पिक कीवर्ड का परीक्षण (कुंजी, परीक्षण, परीक्षण नहीं) लेता है, और इसी कुंजी के लिए जोड़ी देता है:
(assoc 'tim *ages*)
;=> (tim . 72)
के बाद से परिणाम हमेशा एक विपक्ष सेल हो सकता है अगर एक आइटम, वर्तमान है अगर Assoc रिटर्न शून्य, तो आइटम उस सूची में नहीं था:
(assoc 'bob *ages*)
;=> nil
एक संघ सूची में मान अपडेट के लिए, setf सीडीआर के साथ इस्तेमाल किया जा सकता है। उदाहरण के लिए, जब जॉन का जन्मदिन आता है और उसकी उम्र बढ़ जाती है, तो निम्न में से कोई भी कार्य किया जा सकता है:
(setf (cdr (assoc 'john *ages*) 35)
(incf (cdr (assoc 'john *ages*)))
incf इस मामले में काम करता है क्योंकि यह setf पर आधारित है।
एसोसिएशन की सूचियों को एक प्रकार के द्विदिश नक्शे के रूप में भी इस्तेमाल किया जा सकता है, क्योंकि मूल्य में बदलाव के लिए कुंजी को उल्टे गध समारोह, रैसॉक का उपयोग करके मूल्य के आधार पर पुनर्प्राप्त किया जा सकता है।
इस उदाहरण में, एसोसिएशन की सूची स्पष्ट रूप से सूची और विपक्ष का उपयोग करके बनाई गई थी, लेकिन एसोसिएशन सूची को पाइरलिस का उपयोग करके भी बनाया जा सकता है, जो कुंजी और डेटा की सूची लेता है और उनके आधार पर एक एसोसिएशन सूची बनाता है:
(pairlis '(john mary tim) '(23 67 82))
;=> ((john . 23) (mary . 67) (tim . 82))
एक एकल कुंजी और मूल्य जोड़ी को एसोन का उपयोग करके एक एसोसिएशन सूची में जोड़ा जा सकता है:
(acons 'john 23 '((mary . 67) (tim . 82)))
;=> ((john . 23) (mary . 67) (tim . 82))
गधे का कार्य सूची से बाएं से दाएं की ओर खोज करता है, जिसका अर्थ है कि एक सूची से उन्हें हटाए बिना या सूची के किसी भी ढांचे को अपडेट करने के बिना, एक संघ सूची में मूल्यों को "मुखौटा" करना संभव है, बस नए तत्वों को जोड़कर सूची की शुरुआत। इसके लिए एकॉन फ़ंक्शन दिया जाता है:
(defvar *ages* (pairlis '(john mary tim) '(34 23 72)))
(defvar *new-ages* (acons 'mary 29 *ages*))
*new-ages*
;=> ((mary . 29) (john . 34) (mary . 23) (tim . 72))
और अब, मेरी के लिए एक खोज पहली प्रविष्टि लौटाएगी:
(assoc 'mary *new-ages*)
;=> 29
संपत्ति सूची
तत्वों की एक अनुक्रम का प्रतिनिधित्व करने के लिए सादा सूची उपयोगी होती है, लेकिन कभी-कभी मूल्य मैपिंग के लिए एक प्रकार की कुंजी का प्रतिनिधित्व करना अधिक सहायक होता है। कॉमन लिस्प इसे करने के कई तरीके प्रदान करता है, जिसमें वास्तविक हैश टेबल्स (देखें 18.1 हैश टेबल कॉन्सेप्ट )। आम लिस्प में दो प्राथमिक तरीके या मूल्य मैपिंग की कुंजी का प्रतिनिधित्व कर रहे हैं: संपत्ति सूची और एसोसिएशन सूची । यह उदाहरण संपत्ति सूचियों का वर्णन करता है।
एक संपत्ति सूची, या plist , एक "सादे" सूची है जिसमें वैकल्पिक मूल्यों को कुंजी और उनके संबंधित मूल्यों के रूप में व्याख्या की जाती है। उदाहरण के लिए:
(defparameter *ages* (list 'john 34 'mary 23 'tim 72))
एक संपत्ति सूची के रूप में माना जा सकता है जो एक पूर्णांक के साथ एक व्यक्तिगत नाम का संकेत देने वाले प्रतीकों को दर्शाता है जो आयु दर्शाता है। सदस्य जैसे सादे सूची कार्यों का उपयोग करके कुछ पुनर्प्राप्ति कार्यों को लागू करना संभव है। उदाहरण के लिए, जॉन की उम्र को पुनः प्राप्त करने के लिए, कोई भी लिख सकता है
(second (member 'mary *age*))
;=> 23
सदस्य फ़ंक्शन mary से शुरू होने वाली सूची की पूंछ लौटाता है, (mary 23 टिम 72) , और दूसरा उस सूची के दूसरे तत्व को लौटाता है, जो कि 23 है । हालांकि यह एक संपत्ति सूची में मूल्यों तक पहुंचने का एक तरीका है, संपत्ति के सूचियों जैसे एक सम्मेलन का उद्देश्य अंतर्निहित प्रतिनिधित्व (एक सूची) से दूर करना और डेटा संरचना के साथ काम करने के लिए उच्च-स्तरीय फ़ंक्शन प्रदान करना है।
संपत्ति सूचियों के लिए, पुनर्प्राप्ति फ़ंक्शन गफ़ है , जो संपत्ति सूची, एक कुंजी (जिसे आमतौर पर एक संकेतक कहा जाता है) लेता है, और संपत्ति सूची में कुंजी के लिए कोई मूल्य नहीं होने पर लौटने के लिए एक वैकल्पिक डिफ़ॉल्ट मान होता है।
(getf *ages* 'tim)
;=> 72
(getf *ages* 'bob -1)
;=> -1
एक संपत्ति सूची में मूल्यों को अपडेट करने के लिए, सेटफ का उपयोग किया जा सकता है। उदाहरण के लिए, जब जॉन का जन्मदिन आता है और उसकी उम्र बढ़ जाती है, तो निम्न में से कोई भी कार्य किया जा सकता है:
(setf (getf *ages* 'john) 35)
(incf (getf *ages* 'john))
incf इस मामले में काम करता है क्योंकि यह setf पर आधारित है।
गुण सूची में एक बार में कई गुण देखने के लिए, गेट-गुण का उपयोग करें।
गेटफ फ़ंक्शन सूची से बाएं से दाएं की ओर खोज करता है, जिसका अर्थ है कि किसी सूची से हटाए बिना या सूची की किसी भी संरचना को अपडेट किए बिना किसी संपत्ति सूची में "मास्क" मान संभव है। उदाहरण के लिए, सूची * का उपयोग कर:
(defvar *ages* '(john 34 mary 23 tim 72))
(defvar *new-ages* (list* 'mary 29 *ages*))
*new-ages*
;=> (mary 29 john 34 mary 23 tim 72)
और अब, मेरी के लिए एक खोज पहली प्रविष्टि लौटाएगी:
(getf *new-ages* 'mary)
;=> 29