जब कुछ पुस्तकालयों को डिज़ाइन द्वारा गायब किया जा सकता है, तो "चेतावनी: मुक्त चर को असाइनमेंट" से निपटना


12

मेरी विधा का बाइट संकलन:

(defun dict-setup-expansions ()
  "Add `dict-mode' specific expansions."
  (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))

चेतावनी देता है:

Warning: assignment to free variable `er/try-expand-list'

यह सामान्य स्थिति है क्योंकि er/try-expand-listएक्सटर्ना में परिभाषित किया गया है; पुस्तकालय expand-regionजो http://elpa.gnu.org पर है

मेरा मोड expand-regionलाइब्रेरी के लिए एक्सटेंशन रजिस्टर करता है, लेकिन बिना expand-regionमोड के मेरा मोड चलाना ठीक है।

मुझे लगता है कि चेतावनी से निपटने का उचित तरीका घोषणा को जोड़ना है:

(defvar er/try-expand-list)

defvar डॉक्स कहते हैं:

The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.

मैं उपयोग करता हूं -*- lexical-binding: t -*-। इसका मतलब यह है कि defvarचर के बिना er/try-expand-listशाब्दिक दायरे में हो और मेरे पास असली बग है?


2
साइड नोट: आपको प्रतीक को उद्धरण नहीं देना चाहिए (defvar er/try-expand-list)
जीनपिएरे

@ जीनपायर निश्चित।
गवेंको

जवाबों:


10

नहीं, setऔर setqलेक्सिकल चर घोषित नहीं करते हैं। ही letकरता है। अगर आपने letयहां इस्तेमाल किया होता तो आपके पास एक बग होता, लेकिन यह ठीक है। डायनामिक वैरिएबल का उपयोग करते समय टाइपो को पकड़ने के लिए चेतावनी ज्यादातर मौजूद है।

चेतावनी defvarको अपने प्रश्न के अनुसार उपयोग में लाने के लिए , लेकिन प्रतीक को उद्धृत करें।


क्या eval-when-compileसिर्फ बेमानी में लपेटना है defvar? मैं बिना किसी चेतावनी के देखता हूं eval-when-compile। लगता है कि eval-when-compileआवश्यक है अगर सक्रिय कोड का उपयोग करें, जैसे (require ...)...
gavenkoa

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