Sự khác biệt giữa setqvà defvartrong 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 setqvà defvartrong 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 defvarcho 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 defvarkhô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ố đó.
defvarvà setqtương tự nhau, nhưng không hoàn toàn giống nhau, trong Emacs Lisp và Common Lisp.
defvarlà 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ộ. defvartuyê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 letlà "cục bộ" theo nghĩa thông thường. Nếu một var bị ràng buộc bởi letv.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 đó, setqthay đổ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.