elisp-defvar-test.el
İçeren adında bir dosyam olduğunu varsayalım :
;;; 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
Bu dosyayı yüklemek ve sonra sıfırdan arabellek gidin ve çalıştırın:
(setq lexical-binding t)
(f1 5)
(let ((my-dynamic-var 5))
(f2))
(f1 5)
gövdesinin beklendiği gibi dinamik olarak kapsamlandırılmış bir değişken olarak f1
davrandığını gösteren 5'i beklendiği gibi döndürür my-dynamic-var
. Ancak son form, my-dynamic-var
bu değişken için sözcüksel kapsam belirleme kullandığını belirten bir geçersiz değişken hatası verir . Bu, aşağıdakilerle ilgili belgelerle çelişiyor gibi görünüyor defvar
:
defvar
Form Ayrıca sürekli dinamik bile bağlı olduğu böylece, "özel" olarak değişken bildirirlexical-binding
t dir.
defvar
Test dosyasındaki formu bir başlangıç değeri sağlayacak şekilde değiştirirsem, değişken belgelerin söylediği gibi her zaman dinamik olarak ele alınır. Bir değişkenin kapsamının neden defvar
bu değişkeni bildirirken bir başlangıç değeri sağlayıp sağlamadığı ile belirlendiğini açıklayabilir mi?
Önemli olması durumunda hata geri izlemesi:
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)