एक प्रतीक जो गैर-फ़ंक्शन स्थिति में है उसे एक चर के नाम के रूप में माना जाता है। में (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
एक बड़ा अपवाद होने के नाते)।