Emacs 24 giờ đây có các biến có phạm vi lexically. Nó cũng vẫn có các biến động phạm vi, tất nhiên. Bây giờ nó có cả hai, tôi khá bối rối về khi một biến sẽ có loại phạm vi. Có một biến số lexical-binding
kiểm soát khi liên kết từ vựng được kích hoạt, và tôi nghĩ rằng tôi đã đọc một cái gì đó về defvar
bây giờ tuyên bố một biến động phạm vi, nhưng nói chung tôi khá bị mất. Có một lời giải thích nào đó về quy tắc phạm vi mới của Emacs 24 không? Hoặc đặt một cách khác, khi tôi nhìn vào một biến trong mã Emacs Lisp viết cho Emacs 24, làm thế nào để tôi biết phạm vi mà biến đó đang sử dụng?Quy tắc mới cho phạm vi biến trong Emacs 24 là gì?
Trả lời
Hướng dẫn sử dụng là nguồn chính xác. Bắt đầu từ đây:
Chig(elisp) Variable Scoping
RET
Ban đầu tôi đã trích dẫn hướng dẫn trong câu trả lời này, nhưng thông tin đó (có niên đại Emacs 24.0.90.1) là hơi ra khỏi ngày. Tốt hơn để đọc hướng dẫn từ bên trong Emacs để thông tin sẽ chính xác cho phiên bản bạn đang sử dụng.
Nếu bạn đặc biệt muốn đọc nó trên một trang web, phiên bản hiện tại:
http://www.gnu.org/software/emacs/manual/html_node/elisp/Variable-Scoping.html
Hãy nói rằng một số mã đang được đánh giá từng bước trong Emacs (hoặc vì bạn chỉ cần làm C-x C-e
hoặc vì một tệp Emacs Lisp đang được tải hoặc vì một hàm từ một móc đang được chạy, vv) và Emacs sắp sửa đánh giá my-abc
trong mã đó. Có lẽ my-abc
là một biến địa phương trong mã đó hoặc có thể nó không được khai báo hoặc có thể nó có một số giá trị toàn cầu, vv. Dù sao, bước hiện tại được đánh giá là my-abc
. Tại thời điểm đó, Emacs chỉ kiểm tra hai điều để quyết định xem có nên đánh giá my-abc
bằng cách sử dụng phạm vi từ vựng hay không.
Điều đầu tiên Emacs kiểm tra là "là my-abc
một biến đặc biệt?". Câu trả lời cho câu hỏi đó là có nếu (defvar my-abc ...)
hoặc (defcustom my-abc ..)
hoặc v.v. được chạy tại bất kỳ thời điểm nào trong quá khứ. Có lẽ (defcustom my-abc ..)
được chạy trong khi tải một số tệp Emacs Lisp khác hoặc có thể bạn đã đánh giá một số mã có chứa (defvar my-abc ...)
trên bộ đệm đầu hoặc có thể không. Nếu câu trả lời là có vì bất kỳ lý do gì, Emacs tại thời điểm này sẽ đánh giá my-abc
bằng cách sử dụng phạm vi động.
Nếu câu trả lời là không, thì Emacs kiểm tra điều thứ hai, là (A) "mã này (có sử dụng số my-abc
) mà tôi (Emacs) đang bước qua?". Đây không phải là (B) "bộ đệm hiện tại là gì?". Nếu bạn vừa nhấn Cx Ce trên bộ đệm, hãy nói foo.el
và nếu biểu thức bạn đã nhấn Cx ce có chứa cuộc gọi đến hàm mah-hello
được xác định trong mah-stuff.el
và nếu cơ quan chức năng mah-hello
chứa cuộc gọi đến hàm có tên my-hello
được định nghĩa trong my-stuff.el
và nếu nội dung chức năng của my-hello
có sử dụng biến có tên là my-abc
thì khi đó Emacs cuối cùng sẽ thực hiện my-hello
và sau đó là để đánh giá my-abc
trong đó, tại thời điểm đó Emacs hỏi Câu hỏi A, câu trả lời my-stuff.el
cho chính nó. Không phải bộ đệm foo.el
có chứa biểu thức bắt đầu.
Sau đó, Emacs hỏi "có phải là my-stuff.el
một bộ đệm có phạm vi từ vựng, nói cách khác, là lexical-binding
đúng trên bộ đệm đó không?".Nếu có, Emacs đánh giá my-abc
bằng cách sử dụng phạm vi từ vựng, nếu không sử dụng phạm vi động.
Một số cập nhật: Ngoài ra, khi mã được trích dẫn dưới dạng dữ liệu và sau đó được chuyển đến hàm eval
, câu trả lời cho (A) sẽ không phải là bộ đệm. Tuy nhiên, nó như thể eval
tạo nên một bộ đệm tưởng tượng để đặt mã, và đặt giá trị bộ đệm cục bộ là lexical-binding
cho bộ đệm đó cho đối số thứ hai được chuyển đến eval
. Câu trả lời cho (A) là không bộ đệm chứa lệnh gọi `eval '. Nó là bộ đệm tưởng tượng.
Đối với macro Lisp, khi một số mã macro được mở rộng đang được chạy, nó giống như mã mở rộng được ghi vào bộ đệm chứa mã đã gọi macro. Do đó, câu trả lời cho (A) trong trường hợp này là không phải là bộ đệm đã xác định macro, nhưng vùng đệm nơi mã được gọi là macro cư trú.
Giải thích tuyệt vời. Cảm ơn! – killdash9
- 1. Quy tắc phạm vi trong Clojure
- 2. Mô tả ngắn gọn về các quy tắc phạm vi?
- 3. các quy tắc Phạm vi cho Vals tại Scala cho-comprehensions
- 4. Phạm vi biến trong chuỗi `class_eval` là gì?
- 5. Phạm vi của * CSS hack là gì?
- 6. Phạm vi của biến lambda trong C# là gì?
- 7. Quy tắc cho tên tệp khớp với initWithNibName là gì?
- 8. Quy tắc chung về nhập khẩu Python là gì?
- 9. Quy tắc CSS này là gì?
- 10. Các quy tắc truyền lại cho TCP là gì?
- 11. Tại sao Mathematica phá vỡ các quy tắc phạm vi bình thường trong Mô-đun?
- 12. python biến phạm vi
- 13. Phạm vi biến trong C++
- 14. Lambda biến phạm vi
- 15. Shell Python trong Emacs 24?
- 16. Quy tắc của thứ tự của nhiều biến kiểu trong haskell là gì?
- 17. Phạm vi của <ui:param> trong JSF là gì?
- 18. tuyên bố phạm vi quy tắc chống lừa đảo toàn cầu và khai báo @members
- 19. Quy tắc bảo mật thừa kế vi phạm trong khi ghi đè thành viên - SecurityRuleSet.Level2
- 20. Phạm vi của phiên HTTP là gì?
- 21. Coffeescript/Javascript biến phạm vi
- 22. Phạm vi của các biến trong KSH
- 23. Phạm vi của biến được khởi tạo trong câu lệnh if là gì?
- 24. Phạm vi biến đổi trong dưa chuột
- 25. Biến chuỗi biến xây dựng cho "$ GLOBALS" hoạt động trong phạm vi toàn cầu, nhưng không hoạt động phạm vi
- 26. Quy tắc ra lệnh kế thừa các biến tĩnh trong Java là gì?
- 27. Biến phạm vi vấn đề
- 28. PHP, một phạm vi biến lẻ?
- 29. Trong Javascript, phạm vi của các biến được sử dụng trong setTimeout là gì?
- 30. Sự nhầm lẫn phạm vi biến đổi trong C#
Nếu bạn đã cài đặt Emacs 24, thông tin này có sẵn trong thông tin. Mở nút "Emacs Lisp" và nhấn 'i' để tìm kiếm chỉ mục. –
Tôi đã cài đặt cả 23 và 24, vì vậy nó hơi khó hiểu. Có cả mục "Elisp" và "Elisp (emacs-snapshot)". Tôi thấy nó bây giờ. Ngoài ra, đôi khi tôi quên rằng Emacs là một trong những dự án có tài liệu tốt, và có lẽ không phải là loại kết hợp các tính năng mới chính mà không có tài liệu đầy đủ. –