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