मुझे इस तरह की दो संपत्ति सूचियों का विलय करने के लिए एक मानक एलिस्फ़ लाइब्रेरी फ़ंक्शन नहीं मिला है:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
मैं कुछ के साथ निर्माण कर सकता था dolist
, लेकिन इससे पहले कि मैं यह जांचना चाहूँ कि मैं किसी पुस्तकालय में किसी मौजूदा कार्य को नहीं देख रहा हूँ।
अपडेट, टिप्पणियों के आधार पर :
- "कई-तरीकों" की टिप्पणी के जवाब में:
मैं कल्पना करूंगा कि ऐसा कोई फ़ंक्शन नहीं है क्योंकि प्रश्न के लिए अलग (और संभवतः मान्य) उत्तर संभव हैं: क्या करना है जब आपके पास अलग-अलग मूल्यों के साथ संपत्ति के नाम की नकल है?
हां, डुप्लिकेट को मर्ज करने के तरीके पर एक सवाल है, लेकिन इसे संबोधित करने के अपेक्षाकृत कम तरीके हैं। मैं दो सामान्य दृष्टिकोण देखता हूं। पहला, तर्क आदेश डुप्लिकेट को हल कर सकता है; जैसे कि क्लोजर के मर्ज में सबसे सही जीत । दूसरा, मर्ज एक उपयोगकर्ता-प्रदान कॉलबैक फ़ंक्शन को सौंप सकता है, जैसा कि रूबी के मर्ज में है ।
किसी भी मामले में, यह करने के विभिन्न तरीके हैं कि यह कई अन्य भाषा मानक पुस्तकालयों को मर्ज फ़ंक्शन प्रदान करने से नहीं रोकता है। उसी सामान्य तर्क को छँटाई के बारे में कहा जा सकता है, और फिर भी एलीस्प छँटाई की कार्यक्षमता प्रदान करता है।
- "क्या आप विस्तृत कर सकते हैं?" / "कृपया वह व्यवहार निर्दिष्ट करें जो आप ठीक-ठीक देख रहे हैं।"
आमतौर पर, मैं एलिसा समुदाय का उपयोग करने के लिए तैयार हूं। यदि आप एक विशिष्ट उदाहरण चाहते हैं, तो यहां एक उदाहरण होगा जो काम करेगा:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
और लौटता है
'(k1 1 k2 2 k3 0))
यह एक सही-जीत शैली होगी, जैसे क्लोजर का मर्ज।
- "वे सूची में हैं, तो बस संलग्न हैं?"
नहीं, संपत्ति सूची शब्दार्थ को append
संरक्षित नहीं करता है । यह:
(append '(k1 1 k2 2) '(k2 0))
यह लौटाता है:
(k1 1 k2 2 k2 0)
एपेंड `सी सोर्स कोड 'में एक अंतर्निहित फ़ंक्शन है।
(संलग्न और बाकी के सत्र)
सभी तर्कों को संक्षिप्त करें और परिणाम को एक सूची बनाएं। परिणाम एक सूची है जिसके तत्व सभी तर्कों के तत्व हैं। प्रत्येक तर्क एक सूची, वेक्टर या स्ट्रिंग हो सकता है। अंतिम तर्क की प्रतिलिपि नहीं बनाई गई है, बस नई सूची की पूंछ के रूप में उपयोग की जाती है।
- "और आपका उदाहरण मर्ज की तरह कुछ भी नहीं दिखाता है - यह दो संपत्ति सूचियों को भी नहीं दिखाता है।"
हाँ यह करता है; यह स्टेप बाय स्टेप मर्ज करता है। यह दिखाता है कि एलिस्प की प्रलेखित संपत्ति सूची के कार्यों का उपयोग करके मर्ज कैसे किया जाता है:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
बस इसके परिणामस्वरूप आउटपुट मान प्रदर्शित करें pl
:
(key-1 value-1 key-2 value-2)
दोहराने के लिए, मैं इस समस्या को हल करने के लिए एक फ़ंक्शन लिखने में सक्षम हूं, लेकिन मैं पहले यह पता लगाना चाहता था कि क्या ऐसा फ़ंक्शन आम उपयोग में कहीं मौजूद है।
अंत में, यदि आपने प्रश्न को अस्वीकार कर दिया है क्योंकि आपको यह स्पष्ट नहीं मिला है, तो मैं पूछूंगा कि अब आप पुनर्विचार करें कि मैं स्पष्ट करने के कुछ प्रयास में गया हूं। यह शोध की कमी नहीं है। "सूचियों" पर एलिस्फ़ दस्तावेज़ में प्रश्न का उत्तर नहीं दिया गया है।
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
जो तब तक ही है (:a 3 :b 2 :a 1)
जब तक आप केवल प्लिस्ट कार्यों का उपयोग करते हैं।
plist-get
और न ही plist-member
देखभाल करने के लिए अगर कई समान चाबियाँ हैं। ऐसा लगता है कि वे इस संबंध में एकरूपता का व्यवहार करते हैं (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
:। इस बीच, (plist-put '(:a "a" :b "b" :a "c") :a "d")
पहली :a
कुंजी का मूल्य बदल जाता है लेकिन दूसरा नहीं।
append
?