सेटक और डिफावर में क्या अंतर है


14

Emacs में setqऔर defvarलिस्प में क्या अंतर है ?

मुझे /programming/3855862 पर समान प्रश्न का सामान्य लिस्प संस्करण दिखाई देता है । क्या वे एलीस्प में समान हैं?

जवाबों:


18

आपको Emacs से यह प्रश्न पूछना चाहिए : C-h iElisp m ElispManual ( ) चुनें, और "defvar" ( i defvar) के लिए इंडेक्स खोजें । यह आपको परिभाषित चर को नोड करने के लिए ले जाता है ।

Emacs आपको बताता है कि defvarएक डॉक्टर स्ट्रिंग संलग्न करने की अनुमति देता है , और यदि चर पहले से ही एक मूल्य है तो यह कुछ भी नहीं करता है

यह आपको defvarअसाइन किए जाने वाले मूल्य के उपयोग के बारे में भी बताता है (defvar foo):। यह आपको बताता है कि चर को गतिशील रूप से स्कोप घोषित किया गया है

setq उन गुणों में से कोई भी नहीं है।

defvarऔर setqसमान हैं, लेकिन Emacs लिस्प और कॉमन लिस्प में समान नहीं हैं।

अधिक जानने के लिए, और पढ़ें।


1
वास्तव में डिफावर भी "डायनेमिक स्कूपिंग" की घोषणा करता है यदि कोई मूल्य दिया जाता है, और यह तब भी सही रहता है जब चर पहले से ही मूल्य था। OTOH "यदि वैरिएबल का पहले से ही मान है तो यह कुछ भी नहीं करता है" डिफ़वर के सभी वैध उपयोगों के लिए सही है (और बायटेकॉम्पेलेर को शेष मामलों में चेतावनी जारी करनी चाहिए, अर्थात यदि इसके पहले उपयोग के बाद वैरिएबल घोषित किया जाता है)।
यंगफ्रॉग

इसलिए ऐसा लगता है defvarकि एक वैश्विक चर (जैसा कि अनिवार्य प्रोग्रामिंग शैली में) और अनुकूलन के लिए एक सम्मेलन है, जबकि सेटैक कार्यात्मक प्रोग्रामिंग भाषाओं (गतिशील / लेक्सिकल स्कूपिंग नियम के साथ) में एक बंधन के समान है, जिसके आधार पर वैश्विक स्कूपिंग मोड सक्रिय है। .......)
निकोलस

@nicolas: कृपया मैनुअल पढ़ें। setqएक var मान सेट करता है, भले ही var (घटना) स्थानीय हो। defvarवैर को वैश्विक घोषित करता है। (यह "बफ़र-लोकल" भी हो सकता है local-variable-p:)। एक फंक्शन अर्ग या बायर के रूप में होने वाली एक वार्निंग letसामान्य अर्थ में "लोकल" है। यदि letआदि से बंधा कोई संस्करण वैश्विक है (या बफर-लोकल) तो उसके लिए एक स्थानीय बाइंडिंग (सामान्य अर्थ) बनाया जाता है, उस अवधि / दायरे के लिए let। उस बाध्यकारी दायरे के भीतर, setqस्थानीय मूल्य को बदलता है। एक var घटना स्थानीय होने के बारे में बात करना बेहतर है (स्टैक पर) या वैश्विक (ढेर पर) एक var ऐसा होने से।
ड्रू

1
@nicolas: अपना समय इसे पढ़ने और इसे पुनर्मूल्यांकन करने में लगाइए। कभी-कभी यह जो कहता है वह एक विशिष्ट विनिर्देश की तरह सटीक लेकिन कठिन है। एक बार जब आप इसे प्राप्त कर लेते हैं, तो आपके लिए M-x report-emacs-bugउन सुधारों का सुझाव देना मददगार हो सकता है जो दूसरों को इसे आसान बनाने में मदद कर सकते हैं।
ड्रू

1
@nicolas: ढेर पर एक चर (उर्फ एक वैश्विक या बफर-स्थानीय चर) को समझने के साथ शुरू करें । आप पहले से ही वास्तविक स्थानीय चर को समझ सकते हैं, अर्थात, स्टैक पर चर । Googling भी मदद कर सकता है।
ड्रू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.