Sự khác biệt giữa setq
và defvar
trong Emacs lisp là gì?
Tôi thấy phiên bản lisp phổ biến của cùng một câu hỏi tại /programming/3855862 . Họ có giống nhau ở Elisp không?
Sự khác biệt giữa setq
và defvar
trong Emacs lisp là gì?
Tôi thấy phiên bản lisp phổ biến của cùng một câu hỏi tại /programming/3855862 . Họ có giống nhau ở Elisp không?
Câu trả lời:
Bạn nên hỏi Emacs câu hỏi này : C-h i
, chọn hướng dẫn Elisp ( m Elisp
) và tìm kiếm chỉ mục cho "defvar" ( i defvar
). Điều đó đưa bạn đến nút Xác định biến .
Emacs cho bạn biết rằng defvar
cho phép đính kèm một chuỗi doc và nếu biến đã có giá trị thì nó không làm gì cả .
Nó cũng cho bạn biết về việc sử dụng defvar
không có giá trị được gán : (defvar foo)
. Nó cho bạn biết rằng khai báo biến đó là phạm vi động .
setq
không có thuộc tính nào trong số đó.
defvar
và setq
tương tự nhau, nhưng không hoàn toàn giống nhau, trong Emacs Lisp và Common Lisp.
defvar
là một biến toàn cục (như trong phong cách lập trình bắt buộc) và một quy ước cho tùy chỉnh, trong khi setq giống như một ràng buộc trong các ngôn ngữ lập trình chức năng (với quy tắc phạm vi động / từ vựng tùy thuộc vào chế độ phạm vi toàn cầu nào đang hoạt động .. .......)
setq
đặt một giá trị var, bất kể var (xảy ra) là cục bộ. defvar
tuyên bố một var là toàn cầu. (Nó cũng có thể là "bộ đệm cục bộ" : local-variable-p
.) Một sự xuất hiện var bị ràng buộc như một hàm arg hoặc bởi let
là "cục bộ" theo nghĩa thông thường. Nếu một var bị ràng buộc bởi let
v.v. là toàn cục (hoặc đệm cục bộ) thì một ràng buộc cục bộ (nghĩa thông thường) được tạo cho nó, trong khoảng thời gian / phạm vi của điều đó let
. Trong phạm vi ràng buộc đó, setq
thay đổi giá trị địa phương. Tốt hơn là nói về một sự xuất hiện của var là cục bộ (trên stack) hoặc toàn cầu (trên heap) hơn là một var là như vậy.
M-x report-emacs-bug
để đề xuất các cải tiến có thể giúp người khác làm cho nó dễ dàng hơn.