मैक्रोज़ के लिए चर स्कोपिंग कैसे निर्धारित की जाती है?


11

निम्नलिखित उदाहरण मैक्रो को लें, जिसमें परिभाषित किया गया है macro.el

(defmacro some-macro (&rest body)
  `(let ((some-variable 1))
     ,@body))

और निम्नलिखित समारोह, ले एक अलग फाइल में परिभाषित , function.el

(defun some-function ()
  (some-macro (do-something)))

जब function.elबाइट-संकलित किया जाता है, तो some-variableलेक्सिकल या डायनेमिक बाइंडिंग के तहत बाध्य होगा ?

मैं समझता हूं कि यह निर्भर करता है कि फ़ाइल उपयोग करती है या नहीं -*- lexical-binding: t; -*-, इसलिए मेरा प्रश्न विशेष रूप से निम्नलिखित स्थितियों का संबंध है:

  1. यदि function.elलेक्सिकल बाइंडिंग का उपयोग करता है, लेकिन macro.elनहीं करता है।
  2. यदि macro.elलेक्सिकल बाइंडिंग का उपयोग करता है, लेकिन function.elनहीं करता है।

क्या यह एक अंतर है अगर some-varवैश्विक घोषित किया गया है (एक बचाव के साथ) अंदर function.el? यदि ऐसा होता है, तो मुझे उस मामले में विशेष रूप से दिलचस्पी है जहां यह नहीं है


मुझे लगता है कि Jisang Yoo पर कुछ विस्तार से इस कवर yoo2080.wordpress.com/2013/08/14/...
फिल्स

मुझे यकीन नहीं है, लेकिन मैं शर्त लगाता हूं कि मैक्रो विस्तार मैक्रो परिभाषा से नहीं, बल्कि विस्तार साइट से बाइंडिंग शब्दार्थ को विरासत में मिला है। विस्तार से यह समझ में आएगा क्योंकि कॉल साइट पर विस्तार वास्तव में प्रतिस्थापित है। लेकिन: आप क्यों जानना चाहते हैं? क्या आप कोड लिखने का इरादा रखते हैं जो वास्तव में इन विवरणों पर निर्भर करता है ?!
चंद्रग्रहण

@lunaryorn मैक्रो पूरी तरह से इस पर निर्भर नहीं करता है, लेकिन यह उपयोगकर्ता के लिए आश्चर्यजनक बग उत्पन्न कर सकता है यदि यह उस फ़ाइल के बंधन का सम्मान नहीं करता है जिसका उपयोग किया जाता है।
Malabarba

@ मलबारबा अपने मैक्रो को इस तरह लिखें कि लक्ष्य बफर में बाध्यकारी पर निर्भर न हो, फिर। या इससे भी बेहतर, एक मैक्रो का उपयोग न करें।
चंद्रग्रहण

@lunaryorn मैं बिल्कुल स्पष्ट नहीं था। मैक्रो सिर्फ एक लेट फॉर्म है, और यह विज्ञापन के रूप में काम करता है। मैं बस यह सुनिश्चित करना चाहता हूं कि यह फ़ॉर्म उस फ़ाइल में निर्दिष्ट स्कोपिंग का अनुसरण करता है जो इसमें विस्तारित है। यह प्रश्न यह पता लगाने का हिस्सा है कि क्या यह स्वचालित रूप से होता है या यदि मुझे मैक्रो में कोड करने की आवश्यकता है।
मालाबार

जवाबों:


9

(let ((some-variable ..)) ...)आपके उदाहरण के लिए जिस तरह का स्कूपिंग सक्रिय है , वह मैक्रो कॉल की साइट पर सक्रिय है (यानी जो लागू होता है some-function)।

एक मैक्रो यह जान सकता है कि कोड के लिए किस तरह के स्कूपिंग का उपयोग किया जाएगा, यह lexical-bindingचर के मूल्य की जांच करके वापस आ जाता है ।

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