पुश और ऐड-टू-लिस्ट में क्या अंतर है?


28

मैंने पाया है कि उनके इंस्टॉलेशन निर्देशों में अलग-अलग पैकेज या तो पुश या ऐड-टू-लिस्ट का उपयोग करते हैं (उदाहरण के लिए एक निर्देशिका को लोड-पथ में जोड़ना) और मैं सोच रहा था कि क्या अंतर है और प्रत्येक के लिए उपयोग का मामला क्या होगा।


1
मैं का उपयोग कर परिवर्तित कोड के लिए संघर्ष कर रहा था add-to-listका उपयोग कर कोड को cl-pushnew, और मैंने पाया काफी enlightling जा करने के लिए इस ब्लॉग पोस्ट: yoo2080.wordpress.com/2013/09/11/...
dangom

जवाबों:


22

क्या # ज़ेक उल्लेख एक अंतर है। लेकिन अगर केवल यही अंतर होता तो आप के बारे में पूछ सकते हैं cl-pushnewऔर add-to-list

एक और महत्वपूर्ण अंतर: add-to-listएक फ़ंक्शन है, जिसका अर्थ है कि यह अपने सभी तर्कों का मूल्यांकन करता है, विशेष रूप से, पहला। pushएक मैक्रो है (जैसा है cl-pushnew) - यह उसके दूसरे तर्क का मूल्यांकन नहीं करता है; इसके बजाय, यह एक सामान्यीकृत स्थान के रूप में व्याख्या करता है।

उदाहरण के लिए, यदि दूसरा तर्क एक प्रतीक है तो इसे एक चर के रूप में माना जाता है, और पहले तर्क के मूल्य को उस प्रतीक के मान पर एक चर के रूप में स्वीकार किया जाता है, और चर को उस नए विपक्ष में सेट किया जाता है।

जैसा कि डॉक्टर स्ट्रिंग add-to-listकहते हैं:

This is handy to add some elements to configuration variables,
but please do not abuse it in Elisp code, where you are usually
better off using `push' or `cl-pushnew'.

6
बाइट-कम्पाइलर के अनुसार:add-to-list can't use lexical var ...; use push or cl-pushnew
मालाबार

(push (5 6) my-list)अभी भी मुझे एक त्रुटि देता है - 5एक फ़ंक्शन नहीं है। यह कैसे add-to-listव्यवहार से अलग है ?
markasoftware

@markasoftware: आप क्या करने की कोशिश कर रहे हैं? यदि आप सूची (5 6)को स्थान (चर का मान) पर धकेलना चाहते हैं my-listतो आपको सूची बनाने की आवश्यकता है (5 6)। ऐसा करने का एक तरीका उपयोग करना है '(5 6); एक और उपयोग करना है (list 5 6)pushतर्क का मूल्यांकन करता है।
ड्रयू

@ अभी आप कहते हैं कि यह तर्क का मूल्यांकन करता है, लेकिन आपका उत्तर शाब्दिक रूप से कहता है "यह अपने पहले तर्क का मूल्यांकन नहीं करता है", जो मेरी उलझन का स्रोत है।
markasoftware

@markasoftware: मुझे क्षमा करें; मेरे पास एक टाइपो था - मैंने "पहला तर्क" लिखा था, जहां मुझे "दूसरा तर्क" लिखना चाहिए था। अभी ठीक किया है - धन्यवाद। दूसरा आर्ग pushएक जगह है, जैसे कि एक चर। पहले arg का मूल्यांकन उस चर के मान पर किया जाता है, और चर को उस नए विपक्ष में सेट किया जाता है। add-to-listवैरिएबल का उत्पादन करने के लिए इसके पहले arg का मूल्यांकन करता है जिसका मूल्य अपडेट हो जाता है। pushइसके दूसरे arg का मूल्यांकन नहीं करता है, जो अद्यतन करने के लिए चर है। दोनों के बीच आर्ग क्रम उलट जाता है।
ड्रयू

15

से Emacs प्रलेखन , या C-h f push:

मैक्रो: धक्का तत्व सूचीनाम

यह मैक्रो एक नई सूची बनाता है जिसकी कार तत्व है और जिसकी सीडीआर सूचीनाम द्वारा निर्दिष्ट सूची है, और उस सूची को सूचीनाम में सहेजती है।

उसी पृष्ठ से, या C-h f add-to-list:

फंक्शन: ऐड-टू-लिस्ट प्रतीक तत्व और वैकल्पिक परिशिष्ट तुलना-एफएन

यह फ़ंक्शन पुराने मान पर तत्व को परिवर्तित करके चर प्रतीक सेट करता है, यदि तत्व पहले से ही उस मूल्य का सदस्य नहीं है।

add-to-listयदि तत्व पहले से ही नहीं है तो केवल धक्का देता है।


cl-pushnewजैसा व्यवहार करता है add-to-list
सैम बोसालिस

15

एक और अंतर:

pushसूची की शुरुआत में तत्व जोड़ता है ।

add-to-listआपको सूची की शुरुआत या अंत में तत्व जोड़ने की अनुमति देता है ।

(setq testasdf nil)

(push 'a testasdf)

testasdf
(a)

(add-to-list 'testasdf 'b)

testasdf
(b a)

;; add element to the end
(add-to-list 'testasdf "hello" t)

testasdf
(b a "hello")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.