मान लीजिए कि मेरे पास एक फ़ाइल है, जिसका नाम है elisp-defvar-test.el
:
;;; elisp-defvar-test.el --- -*- lexical-binding: t -*-
(defvar my-dynamic-var)
(defun f1 (x)
"Should return X."
(let ((my-dynamic-var x))
(f2)))
(defun f2 ()
"Returns the current value of `my-dynamic-var'."
my-dynamic-var)
(provide 'elisp-dynamic-test)
;;; elisp-defvar-test.el ends here
मैं इस फाइल को लोड करता हूं और फिर स्क्रैच बफर में जाता हूं और रन करता हूं:
(setq lexical-binding t)
(f1 5)
(let ((my-dynamic-var 5))
(f2))
(f1 5)
उम्मीद के मुताबिक 5 रिटर्न देता है, यह दर्शाता है कि शरीर एक गतिशील रूप से स्कोप किए गए चर के रूप f1
में व्यवहार कर रहा है my-dynamic-var
, जैसा कि अपेक्षित था। हालांकि, अंतिम रूप इसके लिए एक शून्य-चर त्रुटि देता है my-dynamic-var
, यह दर्शाता है कि यह इस चर के लिए शाब्दिक स्कोपिंग का उपयोग कर रहा है। ऐसा लगता है कि प्रलेखन के साथ बाधाओं पर defvar
, जो कहता है:
defvar
प्रपत्र भी "विशेष" के रूप में चर घोषणा करता है, यह हमेशा गतिशील रूप से बाध्य है ताकि भले हीlexical-binding
टी है।
यदि मैं defvar
प्रारंभिक मूल्य की आपूर्ति करने के लिए परीक्षण फ़ाइल में फ़ॉर्म बदलता हूं , तो चर को हमेशा डायनामिक माना जाता है, जैसे कि दस्तावेज कहता है। क्या कोई यह समझा सकता है defvar
कि उस चर की घोषणा करते समय एक प्रारंभिक मूल्य के साथ आपूर्ति की गई थी या नहीं, इसके द्वारा किसी चर का निर्धारण क्यों किया जाता है ?
यदि यह मायने रखता है, तो यहां त्रुटि बैकट्रेस है:
Debugger entered--Lisp error: (void-variable my-dynamic-var)
f2()
(let ((my-dynamic-var 5)) (f2))
(progn (let ((my-dynamic-var 5)) (f2)))
eval((progn (let ((my-dynamic-var 5)) (f2))) t)
elisp--eval-last-sexp(t)
eval-last-sexp(t)
eval-print-last-sexp(nil)
funcall-interactively(eval-print-last-sexp nil)
call-interactively(eval-print-last-sexp nil nil)
command-execute(eval-print-last-sexp)