चर नामों से पहले एकल उद्धरण का उपयोग कब या कब नहीं करना है?


31

मेरे पास नीचे है:

(setq some-variable "less")

मैं असमंजस में हूं कि मुझे एकल उद्धरण का उपयोग क्यों करना है, boundpलेकिन इसके साथ नहीं bound-and-true-p

उदाहरण 1:

(when (boundp 'some-variable) 
   (message "some-variable is %s" some-variable))

परिणाम:

"कुछ-चर कम है"

उदाहरण 2a:

(when (bound-and-true-p some-variable) ;; Note that using single-quote causes error
   (message "some-variable is %s" some-variable))

परिणाम:

"कुछ-चर कम है"

उदाहरण 2 बी:

(when (bound-and-true-p 'some-variable) ;; Note that using single-quote causes error
   (message "some-variable is %s" some-variable))

परिणाम:

और: गलत प्रकार तर्क: प्रतीक, (कुछ-चर उद्धरण)


5
यह ध्यान देने योग्य है कि मूल रूप से setqखड़ा है set quoted, और मूल रूप से एक मैक्रो था जिसका विस्तार हुआ था (set 'some-variable "less")। सामान्य तौर पर, एलिस्स को उद्धृत बनाम अयोग्य दलीलों के बारे में बहुत अधिक सुसंगत नहीं है, लेकिन किसी भी फ़ंक्शन (मैक्रो) को एक मान के बजाय एक चर के साथ बातचीत करने की आवश्यकता होती है जो उसके तर्क को उद्धृत किया जाएगा ( setqएक बड़ा अपवाद होने के नाते)।
शास्त्री

2
FWIW, bound-and-true-pएक बेवकूफ मैक्रो है। या यों कहें कि इसका नाम बेवकूफ है। उस समय का 99.99% जब आप करना चाहते हैं (and (boundp 'FOO) FOO)आप इसका उपयोग मूल्य के उपयोग केFOO लिए करते हैं । आप केवल एक सत्य मूल्य प्राप्त करने के लिए ऐसा नहीं करते हैं। (1) मैक्रो की जरूरत नहीं है - यह कोड की जगह तुच्छ और छोटा है। (२) नाम भ्रामक है - यह परिवर्तनीय मूल्य के बारे में है, न कि केवल यह परीक्षण करना कि चर मूल्य है या नहीं nil
ड्रू

जवाबों:


24

संक्षिप्त जवाब

यदि आप चर का उपयोग करने का प्रयास कर रहे हैं, तो उपयोग करें 'some-variable। यदि आप चर में संग्रहीत मान का उपयोग करने का प्रयास कर रहे हैं, तो उपयोग करें some-variable

  • बाउंड सिंबल का उपयोग करता है इसलिए यह किसी भी चीज़ को देखेगा जो फंक्शन्स सहित बाध्य हो सकती है। यह केवल परवाह करता है कि क्या कोई प्रतीक है जो मेल खाता है, न कि मूल्य क्या है।
  • बाध्य-और-ट्रू संस्करण का उपयोग करता है और मान लौटाता है। इस मामले में आपको फ़ंक्शन को प्रतीक का मूल्य प्रदान करने की आवश्यकता है। यदि कोई प्रतीक संस्करण बाध्य नहीं है, या मान शून्य है तो यह शून्य वापस आ जाएगा।

व्याख्या

मैनुअल परिभाषा के लिए कृपया मैनुअल देखें ।

'और (quote ...)दोनों emacs- लिस्प में एक ही उद्देश्य का प्रदर्शन करते हैं।

इसका उद्देश्य मूल्यांकन करने के बजाय आस-पास के वातावरण के लिए अविकसित रूप को पारित करना है।

आपके उदाहरण में मान लिया गया है कि हमारे पास उच्च स्तर था

(setq some-variable "less") ;; Rather than just 't for clarity

फिर मूल्यांकन इस प्रकार है:

(when (boundp 'some-variable) 
   (message "some-variable is %s" some-variable))
;; ==> (boundp 'some-variable) ; 't
;; ==> some-variable is "less"

जबकि एक बोली के बिना:

(when (boundp some-variable) ;; Note that using single-quote causes error
   (message "some-variable is %s" some-variable))
;; ==> (boundp "less") ; "less" is not a variable. -> Error

लिस्प का मूल्यांकन रूपों तक पहुंच जाता है, क्योंकि आप मूल्यांकन को रोकने के रूप में उद्धृत करते हैं ताकि वास्तविक चर (या सूची, या फ़ंक्शन नाम) पारित हो जाए।


धन्यवाद! आपके उत्तर ने मुझे दोनों के स्रोतों में प्रवेश कराया और मुझे समाधान के साथ आने में मदद की। मैंने अपने प्रश्न को स्पष्ट उदाहरणों के साथ अद्यतन किया।
कौशल मोदी

6
मुझे खुशी है कि इससे ऑप को मदद मिली, लेकिन यह वास्तव में इस सवाल का जवाब नहीं देता है (एक ही प्रश्न वाले अन्य लोगों के लिए उपयोगी)। आप केवल यह समझाते हैं कि प्रतीकों को उद्धृत करना होगा या फिर उनका मूल्यांकन किया जाएगा। आप यह नहीं समझाते हैं कि ऐसा क्यों नहीं है bound-and-truepऔर सवाल यह है कि मुझे उपयोग करते समय उद्धृत करना है boundpलेकिन उपयोग करते समय नहींbound-and-truep
तारसियस

@ टार्सियस I वास्तव में बीच का अंतर शामिल करता है boundp एक प्रतीक की आवश्यकता के (अविकसित) और bound-and-truepबुलेट बिंदुओं में चर के मान की आवश्यकता है (प्रारंभिक उत्तर के बाद संपादित)
जोनाथन लीच-पेपिन

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

@tarsius इस उत्तर द्वारा समझाया गया मूल्यांकन नियम नहीं हैं? कम से कम बुनियादी केवल उद्धरण शामिल हैं ... आपका उत्तर निश्चित रूप से अधिक पूर्ण है, लेकिन यह विषय से बहुत आगे जाता है, है ना?
टी। वेरॉन

16

एक प्रतीक जो गैर-फ़ंक्शन स्थिति में है उसे एक चर के नाम के रूप में माना जाता है। में (function variable) functionसमारोह-स्थिति (आरंभिक कोष्ठक के बाद) में है और variableनहीं है। जब तक स्पष्ट रूप से उद्धृत चर उनके मूल्यों के साथ प्रतिस्थापित नहीं किए जाते हैं।

यदि आप यह लिखना (boundp my-variable)चाहते हैं कि इसका अर्थ "वह प्रतीक है जो चर के मान में संग्रहीत चर my-variableके रूप में संग्रहीत है " और नहीं "प्रतीक my-variableएक चर के रूप में बंधा हुआ है।"

तो bound-and-truepअलग व्यवहार क्यों करता है ?

यह एक मैक्रो है और सामान्य (फ़ंक्शन) मूल्यांकन नियम यहां लागू नहीं होते हैं, मैक्रोज़ यह तय करने के लिए स्वतंत्र हैं कि क्या और कब उनके तर्क का मूल्यांकन किया जाता है। मैक्रों वास्तव में क्या करते हैं, किसी तरह तर्कों को बदल देते हैं और परिणाम को एक सूची के रूप में वापस करते हैं, जिसका मूल्यांकन किया जाता है। परिवर्तन और अंतिम मूल्यांकन अलग-अलग समय पर होते हैं, जिन्हें मैक्रो-विस्तार-समय और मूल्यांकन-समय कहा जाता है।

यह bound-and-true-pकैसा दिखता है की परिभाषा है :

(defmacro bound-and-true-p (var)
  "Return the value of symbol VAR if it is bound, else nil."
  `(and (boundp (quote ,var)) ,var))

यह रीडर मैक्रोज़ का उपयोग करता है जो लिस्प मैक्रोज़ (उस पर अधिक) से अलग हैं। आगे इसे जटिल न करने के लिए किसी भी रीडर मैक्रोज़ का उपयोग नहीं करना चाहिए:

(defmacro bound-and-true-p (var)
  "Return the value of symbol VAR if it is bound, else nil."
  (list 'and (list 'boundp (list 'quote var)) var))

अगर आप लिखेंगे

(bound-and-true-p my-variable)

यह पहली बार "अनुवादित" है

(and (boundp 'my-variable) my-variable)

और उसके बाद वापस लौटने का मूल्यांकन किया जाता है nil , तो my-variableनहीं है boundpया फिर का मान my-variable(जो निश्चित रूप से भी हो सकता है nil)।


आपने देखा होगा कि विस्तार नहीं था

(and (boundp (quote my-variable)) my-variable)

जैसा कि हम उम्मीद कर सकते थे। quoteएक विशेष रूप है, मैक्रो या फ़ंक्शन नहीं है। मैक्रों की तरह, विशेष रूप अपने तर्कों के साथ जो कुछ भी कर सकते हैं। यह विशेष रूप से विशेष रूप से अपना तर्क देता है, यहां एक प्रतीक है, प्रतीक के चर मूल्य के बजाय। यह वास्तव में इस विशेष रूप का एकमात्र उद्देश्य है: मूल्यांकन को रोकना! मैक्रों अपने दम पर ऐसा नहीं कर सकते, उन्हें ऐसा करने के लिए उपयोग quoteकरने की आवश्यकता है।

तो क्या हो रहा है '? यह एक पाठक मैक्रो है , जैसा कि ऊपर उल्लेख किया गया है, एक जैसा नहीं है लिस्प मैक्रो । जबकि मैक्रोज़ का उपयोग कोड / डेटा को बदलने के लिए किया जाता है, उस पाठ को कोड / डेटा में बदलने के लिए पाठ को पढ़ते समय रीडर मैक्रोज़ का उपयोग पहले किया जाता है।

'something

के लिए एक संक्षिप्त रूप है

(quote something)

`इसका वास्तविक परिभाषा में उपयोग bound-and-true-pएक पाठक मैक्रो है। यदि यह किसी प्रतीक को उद्धृत करता है जैसा कि `symbolइसके बराबर है 'symbol, लेकिन जब इसका उपयोग किसी सूची को उद्धृत करने के लिए किया जाता है, तो `(foo bar ,baz)यह उस रूप में भिन्न रूप से व्यवहार करता है, जिसके साथ उपसर्ग होते हैं, जाते हैं, उनका मूल्यांकन जाता है।

`(constant ,variable)

के बराबर है

(list (quote constant) variable))

यह इस सवाल का जवाब देना चाहिए कि अयोग्य प्रतीकों का मूल्यांकन कभी-कभी क्यों किया जाता है (उनके मूल्यों के साथ प्रतिस्थापित) और कभी-कभी नहीं; मैक्रोज़ उपयोग कर सकते हैंquote एक प्रतीक का मूल्यांकन करने से रोकने के लिए ।

लेकिन bound-and-true-pमैक्रो क्यों हैboundp नहीं है? हमें यह निर्धारित करने में सक्षम होना चाहिए कि क्या मनमाने ढंग से प्रतीक, जो कि रन-टाइम तक ज्ञात नहीं हैं, प्रतीक के रूप में बाध्य हैं। यह संभव नहीं होगा यदि boundpतर्क स्वचालित रूप से उद्धृत किया गया था।

bound-and-true-pयह निर्धारित करने के लिए उपयोग किया जाता है कि क्या एक ज्ञात चर परिभाषित किया गया है और यदि ऐसा है तो इसके मूल्य का उपयोग करें। यह उपयोगी है यदि पुस्तकालय में तीसरे पक्ष के पुस्तकालय पर एक वैकल्पिक निर्भरता है:

(defun foo-get-value ()
  (or (bound-and-true-p bar-value)
      ;; we have to calculate the value ourselves
      (our own inefficient or otherwise undesirable variant)))

bound-and-true-pएक फ़ंक्शन के रूप में परिभाषित किया जा सकता है और तर्क को उद्धृत करने की आवश्यकता होती है, लेकिन क्योंकि यह उन मामलों के लिए अभिप्रेत है जहां आप जानते हैं कि किसी मैक्रो के बारे में आप किस चर की देखभाल करते हैं, जिसका उपयोग आपको टाइप करने से बचाने के लिए किया गया था '


कमाल का जवाब दिया।
चार्ल्स रिची

2

के स्रोत कोड से boundp:

DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
      doc: /* Return t if SYMBOL's value is not void.
Note that if `lexical-binding' is in effect, this refers to the
global value outside of any lexical scope.  */)

boundpएक उम्मीद symbolइनपुट के रूप में। 'some-variableचर का प्रतीक है some-variable

के स्रोत कोड से bound-and-true-p:

(defmacro bound-and-true-p (var)
  "Return the value of symbol VAR if it is bound, else nil."
  `(and (boundp (quote ,var)) ,var))

bound-and-true-pएक उम्मीद variableइनपुट के रूप में।

bound-and-true-pमैक्रो के अंदर , इसे करने से प्रतीक मिलता है (quote ,var)। तो अगर इनपुट है some-variable, (quote ,var)तो परिणाम होगा 'some-variable

लेकिन जब मैं इनपुट 'some-variableदेता bound-and-true-pहूं, मुझे त्रुटि मिलती है: and: Wrong type argument: symbolp, (quote some-variable)क्योंकि मैक्रो 'some-variableइनपुट पर प्रतीक ( ) की उम्मीद नहीं कर रहा है ।


बिलकुल चौकन्ना। ''symbol करता है मेकअप भावना। इसका मतलब है (quote (quote symbol))। आपको त्रुटि मिलने का कारण यह है कि यह एक मान्य तर्क नहीं है boundp
मालाबार

@ मलबारबा धन्यवाद। मैंने सुधार किया है।
कौशल मोदी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.