Làm thế nào tôi có thể hủy liên kết tất cả các định nghĩa biểu tượng với một tiền tố nhất định?


11

Tôi đang thay đổi API của gói hàng của mình khá thường xuyên, nhưng company-modekéo mọi ký hiệu được xác định (nếu cần) trong các lần hoàn thành. Tôi không muốn vô tình sử dụng một tên không liên kết, vậy làm thế nào tôi có thể hủy liên kết tất cả các biến và hàm bắt đầu bằng, nói , my-package-? Sau này, tôi chỉ đơn giản là có thể load-filemột lần nữa.

Câu trả lời:


10

Gọi unload-featuređể xác định tất cả các ký hiệu được xác định là một phần của việc tải tệp Elisp hoặc tệp được biên dịch byte. Hãy chắc chắn rằng tập tin của bạn kết thúc bằng cách gọi provideở cuối. Điều này giả định rằng bạn đã tải tệp bằng một trong các loadhàm hoặc thông qua require, nó sẽ không được xác định các ký hiệu được xác định bởi C-M-x( eval-defun) hoặc các cơ chế tương tự.

Nếu bạn thực sự muốn hủy liên kết các biểu tượng dựa trên tên của chúng thay vì dựa trên gói đã xác định chúng, bạn có thể sử dụng mapatomsđể lặp lại tất cả các biểu tượng.

(mapatoms (lambda (symbol)
            (if (string-prefix-p "foo-" (symbol-name symbol))
                (unintern symbol))))

Hữu ích, nhưng tôi không tin rằng điều này sẽ hiệu quả với sự phát triển tương tác như tôi mô tả. Tôi sâu hơn một cấp so với featurehệ thống; Tôi chỉ làm việc với các hàm và biến mà không có bất kỳ nhóm rõ ràng nào. Tôi không buồn đánh giá (provide 'my-package).
Sean Allred

2
@Sean ALLred Tôi không thể nghĩ ra một lý do chính đáng để không sử dụng provide. Nhưng dù sao, nếu bạn thực sự muốn làm mọi thứ theo cách bẩn thỉu, hãy xem chỉnh sửa của tôi.
Gilles 'SO- ngừng trở nên xấu xa'

Ồ, tôi yêu provide, tôi chỉ không nghĩ rằng nó sẽ hoạt động trong trường hợp này. Các hàm có nhớ tệp nào được xác định nếu chúng được đánh giá tương tác không?
Sean Allred

2
unload-featuresẽ không có hiệu lực nếu bạn đánh giá mã mà không tải nó từ một tệp (có provide).
vẽ

2
@SeanAllred Không, các chức năng chỉ nhớ nơi chúng được tải từ nếu chúng được tải như một phần của việc tải toàn bộ tệp.
Gilles 'SO- ngừng trở nên xấu xa'

7
  • Sử dụng makunboundđể loại bỏ việc sử dụng một biểu tượng như một biến động (nghĩa là để làm mất hiệu lực của nó symbol-value).

  • Sử dụng fmakunboundđể loại bỏ việc sử dụng một biểu tượng như là một chức năng (nghĩa là để làm mất hiệu lực của nó symbol-function).

  • Sử dụng mapatomsđể lặp đi lặp lại trên tất cả các biểu tượng. Hành động theo từng người symbol-nameđược khớp với tiền tố cụ thể mà bạn quan tâm: gọi cả hai makunboundfmakunboundtrên đó.

  • Bạn không cần uninternbiểu tượng, trừ khi bạn cũng đang sử dụng hoàn thành đối với chính các biểu tượng và không chỉ sử dụng chúng làm biến hoặc hàm. Nhưng nếu bạn làm muốn loại bỏ hoàn toàn một biểu tượng sau đó sử dụng unintern.

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.