Tại sao elisp không có không gian tên?


40

Q: Tại sao elisp không có không gian tên, và làm thế nào chúng ta có thể có được chúng?

Elisp không có không gian tên ngoài tên toàn cầu, điều này dẫn đến quy ước mã hóa tiền tố tất cả các hàm, biến và hằng toàn cầu có tiền tố duy nhất.

Ngoài yếu tố gây phiền nhiễu, nó còn gây cho tôi một vấn đề tương tự được đưa ra 1) số lượng thư viện và gói lớn ngày càng mở rộng và 2) sự tồn tại liên tục của các hàm và biến kế thừa không tôn trọng quy ước tiền tố, hoặc đủ bình dị rằng thực sự không có tùy chọn tiền tố tốt mà họ có thể sử dụng. Điều đó cũng có nghĩa là các nỗ lực định kỳ để hợp lý hóa mã cũ hơn (như với việc chuyển đổi từ clsang cl-lib) là một lượng công việc không hề nhỏ. (Mặc dù tôi rất vui vì đã dọn dẹp, tôi vẫn rơi nước mắt mỗi khi tôi gõ một cái gì đó như thế cl-find).

Tôi đã đi khắp nơi để xem liệu tôi có thể tìm ra lý do tại sao elisp vẫn không có không gian tên sau một vài thập kỷ sử dụng, nhưng hơi ngạc nhiên về vụ thu hoạch khiêm tốn. Các trang wiki về không gian tên là khá ngắn. Nic Ferrier đã xử lý vấn đề này lâu hơn một chút và cũng có một chủ đề khá gần đây về emacs-devel về vấn đề này. Có một luồng Stack Overflow cũ từ năm 2010 thảo luận về khả năng sử dụng macro để triển khai các không gian tên; một ví dụ khác về cách tiếp cận vĩ mô có thể được tìm thấy ở đây . Có ít nhất một vài triển khai ( ở đâyở đây , với một mô tả về cái sau ở đây) ngoài đó, nhưng họ đã không thấy nhiều hoạt động trong một vài năm và tôi đã không chạy qua bất kỳ thư viện nào sử dụng chúng.

Tôi đoán rằng, nếu thêm không gian tên là dễ dàng, nó đã được thực hiện. Vì thế:

  • Rào cản kỹ thuật để thêm không gian tên vào elisp là gì?
  • Việc thêm không gian tên sẽ phá vỡ rất nhiều mã hiện có?
  • Là chức năng này một cái gì đó cần phải hữu cơ đến mức không thể thay đổi (thay đổi chính trình thông dịch), hoặc nó thực sự có thể được xây dựng trên đầu thông qua các macro?

6
Bạn có thể xem cái này: github.com/Bruce-Connor/names Nó có vẻ tương thích ngược (với cách phân tách tên thủ công hiện tại) của không gian tên tự động. (Và tôi chắc chắn 99% tôi đã thấy một thư viện như vậy, cho phép nhà phát triển xuất một tập hợp con các hàm với các không gian tên, được đề cập gần đây trên một số blog của emacs, nhưng tôi không thể tìm thấy nó trở lại).
T. Verron

2
Tôi thứ hai bạn nên có một cái nhìn vào liên kết ở trên. Nó là một macro rất gần đây (phát hành tháng trước) và macro không gian tên rất mạnh mẽ. Tôi vẫn đang nghiên cứu một vài kink về khả năng tương thích với các công cụ như edebug, nhưng gói hoạt động. Trả lời câu hỏi của bạn là một bài luận thực sự dài (những rào cản kỹ thuật tôi gặp phải rất nhiều) nhưng tôi sẽ cố gắng đưa nó vào bài viết trên blog trong tuần tới.
Malabarba

1
Tôi đoán không gian tên có nghĩa là những thứ khác nhau. Tôi đã có thể nói emacs có một số không gian tên: Một cho các biến, một cho các hàm và macro, một cho các khuôn mặt, và cho các chủ đề, và
Harald Hanche-Olsen

1
@ HaraldHanche-Olsen bạn chắc chắn có thể nói rằng. Trong bối cảnh đó, anh ta hỏi tại sao không có không gian tên mỗi gói.
Malabarba

Câu trả lời:


28

Tại sao không có không gian tên?

Bởi vì nó phức tạp và không ai coi nó đủ khẩn cấp để thực hiện cú lao hoàn toàn. Điều này đã được thảo luận trong danh sách dev trước đây (nhiều lần hơn một) và đã có những lời hứa sửa lỗi này sau khi chuyển sang git.

Trong khi đó, tôi đã viết một giải pháp của riêng mình (xem bên dưới để biết danh sách các lựa chọn).

Rào cản kỹ thuật là gì?

Chỉ cần ra khỏi cửa là bạn có 3 chướng ngại vật lớn, bạn cần phải vượt qua để các không gian tên thậm chí có cơ hội làm việc trên một Emacs hiện tại:

  • Bạn cần thay đổi cách các biểu tượng được thực tập (đây là phần dễ dàng).
  • Trình biên dịch byte cần hiểu các không gian tên.
  • Thế hệ tự động tải được sử dụng bởi package.elnhu cầu hiểu không gian tên.

Việc vá 3 điều này để làm việc với tuy nhiên bạn đến để triển khai các không gian tên không phải là chuyện nhỏ. Nếu bạn chỉ dành riêng cho phiên bản Emacs gần đây nhất thì chắc chắn là có thể thực hiện được. Nếu bạn đang tìm cách viết một số loại gói hỗ trợ các phiên bản trước đó (như toàn bộ 24 gia đình), thì nó sẽ biến thành một thử thách.

Ngoài ra, có rất nhiều trở ngại tùy chọn khác. Elisp là tuyệt vời vì tất cả sức mạnh trong các công cụ có sẵn cho bạn và TẤT CẢ những thứ này sẽ cần phải được vá để làm việc với các không gian tên. Trong số quan trọng nhất là:

  • edebug
  • eval-defun
  • eval-last-sexp
  • chất nhờn

Nó sẽ phá vỡ rất nhiều mã hiện có?

Không nếu bạn làm đúng.

Đây có phải là thứ gì đó cần phải hữu cơ, hoặc nó thực sự có thể được xây dựng trên đầu thông qua các macro?

Lý tưởng nhất là hữu cơ, đó là những gì thường được thảo luận khi nó xuất hiện trong danh sách nhà phát triển. Nhưng nó có thể được làm đủ tốt trong khi được xây dựng trên đầu trang.
Dưới đây là một vài ví dụ về điều này, được lấy từ danh sách này :


1
Cảm ơn - đó là một thông tin rất quan trọng về vấn đề này. Tôi tò mò về điểm cuối cùng của bạn: namesgiải pháp của bạn . Tôi tự hỏi nếu có lý do nào để nghi ngờ rằng một hữu cơ, tích hợp giải pháp đang đến trong tương lai không-quá-xa, hoặc nếu chúng tôi chỉ nên áp dụng built- trên giải pháp bạn đã cung cấp.
Dân

1
@Dan Vâng, có. . Điều đó nói rằng, không có lý do gì để không chấp nhận Tên trong khi đó. Nó hoàn toàn tương thích với các quy ước của Emacs, vì vậy mọi gói sử dụng Tên đều được tự do ngừng sử dụng Tên bất cứ lúc nào và người dùng sẽ không biết gì.
Malabarba

Bạn thực sự nên thêm namelessvào danh sách này :) Đó là một ý tưởng tuyệt vời, và nó giải quyết vấn đề rất gọn gàng.
Clément

22

Lần trước điều này đã được thảo luận trên emacs-devel, cuộc thảo luận đã dừng lại khi những người như Lars chỉ ra rằng họ muốn có thể làm M-x grepmột cái gì đó. Thêm không gian tên vào Elisp không quá khó, nhưng để có được tất cả các công cụ quen thuộc để xử lý chúng là một vấn đề khác.


Tôi nghĩ rằng có thể dễ dàng 'cố định' bằng cách tạo bí danh cho các hàm phổ biến được sử dụng nhất (hoặc tất cả chúng, có thể)
Jesse

1
Nhu cầu "grep" thường xuất hiện trong khi phát triển một gói, bạn cần biết biến / hàm có thể được sử dụng ở đâu trong các gói khác, vì vậy nó có thể áp dụng cho bất kỳ biến / hàm tùy ý nào, thay vì chỉ cho các biến quan trọng cụ thể. Vì lý do này, thêm một vài bí danh sẽ không có sự khác biệt. Một lý do khác khiến mit không giúp được gì, đó là việc thêm một bí danh sẽ không giúp bạn tìm ra những cách sử dụng không sử dụng bí danh này.
Stefan
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.