ধরুন আমার কাছে একটি ফাইল রয়েছে যার নাম 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
, একটি পরিবর্তনশীল scoped পরিবর্তনশীল হিসাবে হিসাবে প্রত্যাশিত। যাইহোক, শেষ রূপটি একটি অকার্যকর-পরিবর্তনশীল ত্রুটি my-dynamic-var
দেয়, এটি নির্দেশ করে যে এটি এই চলকটির জন্য লেক্সিকাল স্কোপিং ব্যবহার করছে। এটি ডকুমেন্টেশনের সাথে মতবিরোধের সাথে মনে হয় defvar
, যা বলে:
defvar
ফর্ম এছাড়াও "বিশেষ" হিসাবে পরিবর্তনশীল ঘোষণা, এটা সবসময় পরিবর্তনশীল আবদ্ধ হয় যাতে এমনকি যদিlexical-binding
হল t।
যদি আমি 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)