Tôi chỉ dành tuổi để tìm ra những gì sai với mã của tôi. Nó hoạt động tốt trong các bài kiểm tra đơn vị ert, nhưng thất bại khi tôi chạy nó trong một ngữ cảnh lớn hơn. Dưới đây là ví dụ về mã đã hoạt động:Tại sao mã trong bộ đệm-temp phàn nàn về biến void khi bộ đệm "cha" có một biến cục bộ cùng tên mà tôi đã ràng buộc?
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
Bản in z như mong đợi. Bây giờ tôi đã viết một chế độ chính có một số biến vùng đệm. Một trong số đó là của tôi-var. Mã này chứng minh sự cố của tôi:
(make-local-variable 'my-var)
(setq my-var "y")
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
Kết quả? Không có thông báo lỗi nào: chỉ có thông báo lỗi này:
eval-buffer: Symbol's value as variable is void: my-var
Trong ví dụ này, dễ thấy rằng biến cục bộ đệm cản trở bằng cách nào đó bị ràng buộc động-var của tôi. Nó không phải là dễ dàng như vậy khi tôi đã có nhiều màn hình giá trị của mã mặc dù :-)
Vì vậy, câu hỏi của tôi là những gì đang thực sự xảy ra ở đây? Rõ ràng là bộ đệm tạm thời bằng cách nào đó thừa hưởng một biến từ bộ đệm "cha mẹ", nhưng tại sao nó lại có một giá trị void? Tôi sẽ hiểu nếu nó sẽ nhận được giá trị "y" bằng cách nào đó, nhưng hành vi này cảm thấy giống như một lỗi cho tôi.
PS. Tôi đang chạy Aquamacs mới nhất
Nhưng tôi vẫn không hiểu tại sao nó có hiệu lực. Tôi tạo nó với: (make-local-variable my-var) và sau đó tôi đặt giá trị "y" cho nó: (setq my-var "y"). Vì vậy, do thời gian tôi gọi hàm và macro-temp-buffer trong giá trị sẽ không bị vô hiệu. Tôi đang thiếu gì? – auramo
"Nói cách khác, nó chỉ có một ràng buộc trong bộ đệm trong đó nó đã được thiết lập rõ ràng." <- Tôi đã không đặt nó một cách rõ ràng trong bộ đệm tạm thời được tạo ra trong macro với-temp-buffer. Bộ đệm bằng cách nào đó kế thừa biến nhưng không phải là giá trị của nó. Ngoài ra, tôi không muốn tạo ra một biến toàn cầu nếu tôi có thể tránh được điều đó. Tôi có thể sống với tính năng này tốt, tôi chỉ cần nhớ đặt tên cho các biến một cách cẩn thận. Tôi chỉ muốn biết tại sao điều này xảy ra. – auramo
Trên thực tế, có một vài điều đang xảy ra ở đây trong mã của bạn, tôi sẽ cập nhật câu trả lời của mình. –