2010-12-12 57 views
21

Tôi đã sử dụng clojure được vài tháng và một điều tôi thực sự không hiểu là tại sao dấu gạch ngang trong các tên không gian tên phải được biểu diễn dưới dạng dấu gạch dưới trong hệ thống tệp. Bất cứ ai có thể giải thích điều này với tôi, và nó có thể để có thể sử dụng dấu gạch ngang trong tên tập tin quá?Tại sao clojure chuyển đổi dấu gạch ngang trong tên thành gạch dưới trong hệ thống tệp?

Trả lời

26

Đó là giải pháp cần thiết cho khả năng tương tác Java.

Khi không gian tên Clojure là AOT (trước thời hạn) được biên dịch thành tệp .class của Java, nó phải có tên là số nhận dạng Java hợp lệ. Dấu gạch ngang không hợp lệ trong tên lớp Java, vì vậy Clojure chuyển đổi chúng thành dấu gạch dưới. Nó cũng chuyển đổi các ký tự như * thành các từ như _STAR_.

+0

khác với nó không phải là AOT? – Chris

+0

Không. Trình biên dịch Clojure luôn giống nhau. AOT-compilation chỉ ghi các tệp lớp vào đĩa. –

3

Bạn có nghĩa là các tệp .class trên đĩa có dấu gạch dưới trong đó các hàm trong Clojure có bị gạch ngang không? Tôi chắc rằng tôi đọc rằng đó là một cái gì đó để làm với JVM không hỗ trợ dấu gạch ngang trong những tên tập tin. (Hoặc ít nhất nó không phải là một đảm bảo rằng nó hỗ trợ họ.)

Đây chỉ là giới hạn của tên tệp lớp và Clojure âm thầm giải quyết vấn đề này. Mã của riêng bạn vẫn có thể xử lý các tệp có dấu gạch ngang trong tên tệp.

Tôi rất tiếc vì tôi không có tài liệu tham khảo cho điều này ngay bây giờ.

+0

Tôi đã thử đặt dấu gạch ngang trong tệp clj nhưng chương trình clojure của tôi không thể đọc tệp trừ khi tôi thay đổi dấu gạch ngang thành gạch dưới – Zubair

+0

Có, điều này là do giới hạn JVM. Xem http://clojure.org/libs "Dấu gạch ngang trong tên lib được thay thế bằng dấu gạch dưới trong đường dẫn" –

+0

Câu trả lời có nghĩa là gì khi nói "Mã của riêng bạn vẫn có thể xử lý tệp có dấu gạch ngang trong tên tệp". Đây có phải là tệp .clj hoặc tệp .class không? – Zubair

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