सूची में जोड़ने से पहले चर का मूल्यांकन कैसे करें?


30

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

मैं नीचे दिए गए कोड को कैसे सही करूं ताकि मूल्य somelistबन जाए '(("abc" . 123))?

(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))

5
क्या आपने क्वासिकोटिंग की कोशिश की है? कोशिश करो `(,x . ,y)
दान

आह, यही तो याद किया। मुझे नहीं पता था कि :) के लिए क्या करना है। मैंने कोशिश की (add-to-list 'somelist '(,x . ,y))लेकिन बैकवॉट भूल गया।
कौशल मोदी

इस एक के दोहराव के रूप में माने जाने वाले प्रश्न बहुत बार आते हैं। क्या कोई शुरुआती लोगों के लिए यह स्पष्ट करने के लिए एक रास्ता बना सकता है कि यह प्रश्न / उत्तर वह है जिसकी वे तलाश कर रहे हैं? मुझे संदेह है कि समस्या का एक हिस्सा यह है कि इस सवाल का शीर्षक केवल तभी समझ में आता है जब आप समस्या का मूल कारण जानते हैं (अर्थात आप उत्तर जानना चाहते हैं)। मैं अपने आप को एक ऐसे उपयोगकर्ता के रूप में कल्पना करने की कोशिश कर रहा हूं, जिसके पास कोई विचार नहीं है कि चर का मूल्यांकन करने की आवश्यकता है और यहां तक ​​कि एक विचार से भी कम "बोली" का अर्थ है, लेकिन खाली आ रहा हूं। @Drew?
स्टीफन

@stefan: उस मामले के विपरीत जहां कोई त्रुटि संदेश है (जिसका उपयोग किसी समुदाय Q + A के प्रश्न शीर्षक में किया जा सकता है), त्रुटि, यदि कोई हो, जिसके परिणामस्वरूप कुछ उद्धृत करने की आवश्यकता होती है जिसका मूल्यांकन किया जाना चाहिए (और यह एक विशेष है का मामला) उद्धृत के स्थल से बहुत दूर हो सकता है। अधिक सामान्यतः, कोई (Emacs) त्रुटि नहीं है - बस वह व्यवहार जो उपयोगकर्ता नहीं चाहता था।
ड्रू

@Stefan: इसके लिए कोई महान प्रश्न शीर्षक दिमाग में नहीं आता है। लेकिन हम कम से कम एक ऐसा प्रश्न तैयार कर सकते हैं, जो सीधे तौर पर इससे निपटता है, जिसमें शायद एक "सामान्य" मामला भी शामिल है जो केवल उद्धरण चिह्न को हटाने के लिए कहता है और एक ऐसा मामला जो क्वासिकोटिंग के लिए कहता है। एक अच्छा क्यू, ऐसे मामलों को कवर करता है, और उन्हें कवर करने वाला एक अच्छा उत्तर, सहायक होगा। लेकिन क्यू के लिए जो डुप्लिकेट हैं खोजने के लिए: क्यू शीर्षक में एक त्रुटि संदेश के बिना इसे पूरे प्रश्न को पढ़ने और जानने के लिए डुप्लिकेट को खोजने का तरीका जानने की आवश्यकता है।
आकर्षित किया

जवाबों:


30

सामान्य मुद्दा यह है कि आपको इसमें सम्मिलित होने से पहले ज़रूरत है xऔर yमूल्यांकन किया जाना है somelistउद्धृत सूची ( 'रीडर सिंटैक्स के साथ) के साथ मुद्दा यह है कि quoteएक विशेष रूप है जो इसके तर्क का मूल्यांकन नहीं करता है। डॉकस्ट्रिंग के अनुसार:

(quote ARG)

इसका मूल्यांकन किए बिना, तर्क लौटाएं। (quote x)पैदावार x। चेतावनी: quoteइसकी वापसी मूल्य का निर्माण नहीं करता है, लेकिन सिर्फ वह मूल्य देता है जो लिस्प पाठक द्वारा पूर्व-निर्मित किया गया था ...

इसलिए, आप या तो जरूरत backquote या एक समारोह है कि मूल्यांकन करता है तर्क का उपयोग करें।

Backquoting आपको ,सिंटैक्स के साथ चुनिंदा सूची के तत्वों का मूल्यांकन करने की अनुमति देता है :

(setq x "x-val" y "y-val" z "z-val" somelist nil)
'(x  y z)                            ; => (x y z)
`(x ,y z)                            ; => (x "y-val" z)
(add-to-list 'somelist `(x y ,z))    ; => ((x y "z-val"))

वैकल्पिक रूप से, आप उपयोग कर सकते हैं cons(जैसा कि @tarsius उनके उत्तर में सुझाव देता है) या, तत्वों की एक मनमानी संख्या के लिए list:

(add-to-list 'somelist (cons x y))   ; => (("x-val" . "y-val"))
(setq somelist nil)                  ; reset
(add-to-list 'somelist (list x y z)) ; => (("x-val" "y-val" "z-val"))

किसका उपयोग करना है यह इस बात पर निर्भर करता है कि आपको तत्वों के साथ क्या करना है।


19

कॉन्स सेल का उद्धरण न करें, क्योंकि उद्धृत अभिव्यक्तियों का मूल्यांकन नहीं किया जाता है। यही कारण है कि एक उद्धरण - मूल्यांकन को रोकने के लिए। लेकिन वह नहीं है जो आप चाहते हैं, इसलिए नहीं।

इसके बजाय फॉर्म का उपयोग करें जो दो मूल्यांकन किए गए मूल्यों, इसके तर्कों से एक कॉन्स सेल बनाता है।

(cons x y)

बेशक आप यह भी समझा सकते हैं लेकिन यह वास्तव में यहाँ समझ में नहीं आता है, और बुरा लग रहा है। केवल उपयोग करें `और ,जब वह पठनीयता में सुधार करता है, यानी जब एक कॉन्स सेल बनाने या कुछ मौजूदा सूची की शुरुआत में एक एटम या सूची जोड़ने की तुलना में कुछ अधिक जटिल होता है।

Quasiquoting के उपयोग से यह इस तरह दिखेगा:

`(,x . ,y)

जो बदतर है क्योंकि यह अतिरिक्त सिंटैक्स का उपयोग करता है जो इस मामले में बिल्कुल भी आवश्यक नहीं है और consउपयोग किए जा रहे हैं।


3
consआईएनजी पर अच्छा बिंदु । Quasiquoting ने मुझे पठनीयता के बजाय सूची सामग्री के ठीक-ठीक नियंत्रण के बारे में अधिक बताया है, लेकिन मैं मानता हूं कि उपयोग-मामले के लिए समझ में आता है cons
दान

आपके उत्तर के लिए धन्यवाद। मेरे लिए यह एक महान TIL पल था। मैं नेत्रहीन रूप से सूचियों और विपक्ष से पहले उद्धरण लगा रहा था।
कौशल मोदी

@ डान, हाँ - और नहीं। Quasiquoting कुछ भी है कि आप के साथ बस नहीं कर सका ऐसा नहीं कर सकते cons, listऔर nconc। सिवाय पूर्वाभास के। यह सिंटैक्टिक चीनी है जो तब उपयोगी होती है जब आपको "सूची सामग्रियों का ठीक-ठीक नियंत्रण" की आवश्यकता होती है (जैसा कि "शुरुआत में परमाणु या सूची को जोड़ने की तुलना में कुछ अधिक जटिल करना")। और उस सिंटैक्टिक शुगर का उपयोग करने का अतिरिक्त लाभ है: पठनीयता। Quasiquoting आपको अतिरिक्त अधिक दानेदार नियंत्रण नहीं देता है - यह आपको शुरुआती प्रयास में कम बग के साथ एक ही काम करने की अनुमति देता है। :-)
तरसीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.