2011-10-04 28 views
18

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ì?

+2

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. –

+0

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 đủ. –

Trả lời

21

Hướng dẫn sử dụng là nguồn chính xác. Bắt đầu từ đây:

Chig(elisp) Variable ScopingRET

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

3

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ú.

+0

Giải thích tuyệt vời. Cảm ơn! – killdash9

Các vấn đề liên quan