Giả sử tôi xác định biến cục bộ đệm foo
và giá trị mặc định của nó là "a":
(defvar foo "a")
(make-variable-buffer-local 'foo)
(default-value 'foo) ;; => "a"
Ngay sau đó tôi chạy đoạn mã sau:
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "b"
Kết quả là "b", là giá trị tôi đặt let
.
Bây giờ nếu tôi sử dụng setq
để đặt biến, thì hãy chạy lại mã chính xác như trước:
(setq foo "c") ;; => "c"
(let ((foo "b"))
(with-temp-buffer
(message "foo: %s" foo))) ;; => "a"
Kết quả là "a", là giá trị mặc định bây giờ.
Câu hỏi : đối với bộ đệm tạm thời, giá trị mặc định của foo
không được đặt cho đến khi tôi sử dụng setq
? Và miễn là tôi không sử dụng setq
, tôi có thể sử dụng let
để thay đổi giá trị mặc định trong các bộ đệm khác không?
EDIT : như @npostavs đã nói, đây là những gì make-varible-buffer-local
thực sự có nghĩa. Nếu tôi sử dụng make-variable-buffer-local
bản thân, tôi luôn có thể sử dụng setq
sau đó. Nhưng điều này thực sự trở nên khó khăn đối với các biến cục bộ đệm "tích hợp" như thế nào case-fold-search
. nếu tôi, với tư cách là một tác giả gói, liên kết case-fold-search
với nil
bên ngoài let
và tôi muốn sử dụng giá trị mặc định (nó có thể hoặc không được người dùng đặt) trong with-temp-buffer
, tôi phải sử dụng setq
trước with-temp-buffer
để đảm bảo giá trị mặc định thực sự được sử dụng trong trường hợp người dùng không có nó setq
trong đó init.el
. Đối với các biến cục bộ đệm, điều đó có nghĩa setq
là luôn an toàn hơn so với let
khi chúng ta muốn đặt giá trị. Tôi tự hỏi liệu thiết kế hoặc tài liệu có thể được cải thiện.
with-temp-buffer
(có nghĩa là, không có macro). Tôi nghĩ nó giống như một hành vi cụ thể cho các biến đệm cục bộ.
with-temp-buffer
(thay vì trước đó), điều đó có giúp ích gì không?with-temp-buffer
là một macro và nó hoạt động hơi khác so với một chức năng tiêu chuẩn. Ví dụ:(with-temp-buffer (let ((foo "b")) (message "foo: %s" foo)))