Sự khác biệt giữa setq và defvar là gì


Câu trả lời:


18

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ố đó.

defvarsetqtương tự nhau, nhưng không hoàn toàn giống nhau, trong Emacs Lisp và Common Lisp.

Đọc thêm, để tìm hiểu thêm.


1
Trong thực tế, defvar cũng tuyên bố "phạm vi động" nếu có một giá trị được đưa ra và điều đó vẫn đúng ngay cả khi biến đã có giá trị. OTOH "nếu biến đã có giá trị thì nó không có gì" là đúng đối với tất cả các sử dụng defvar hợp lệ (và trình biên dịch mã byte nên đưa ra cảnh báo trong các trường hợp còn lại, tức là nếu khai báo biến sau lần sử dụng đầu tiên).
YoungFrog

do đó, nó có vẻ như 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 .. .......)
nicolas

@nicolas: Vui lòng đọc hướng dẫn. 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.
vẽ

1
@nicolas: Hãy dành thời gian đọc nó và đọc lại nó. Đôi khi những gì nó nói là chính xác nhưng khó nắm bắt, giống như một đặc điểm kỹ thuật chính thức. Khi bạn nhận được nó, nó có thể hữu ích cho bạn 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.
vẽ

1
@nicolas: Bắt đầu với việc hiểu một biến trên heap (còn gọi là biến toàn cục hoặc bộ đệm cục bộ). Bạn có thể đã hiểu các biến cục bộ thực sự, nghĩa là các biến trên ngăn xếp . Googling cũng có thể giúp đỡ.
vẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.