Tôi không biết câu trả lời cuối cùng cho câu hỏi của bạn, nhưng phỏng đoán được giáo dục của tôi là bạn không thể tự sửa đổi clojure. Dưới đây là phân tích của tôi:
Biểu tượng String
được thực tập nội trú tại clojure/lang/Namespace.java
như một phần của ánh xạ mặc định (xem Namespace
constructor trong lớp đó, có sự tham khảo DEFAULT_MAPPINGS
trong lớp clojure/lang/RT.java
). Thực tập có nghĩa là có một khóa trong biến thành viên mappings
của lớp Không gian tên. Kết quả của việc này là mỗi không gian tên bắt đầu bằng String
ánh xạ tới String.class
(xem dòng 77 của RT.java trong clojure 1.4.0).
Trong ns
vĩ mô, bạn có thể làm một cái gì đó như:
(ns my-ns
(:refer-clojure :exclude [<mapping to exclude>]))
nhưng tất cả điều đó không được bỏ qua mã mà thực tập các biểu tượng mới (xem dòng 3770 của clojure/core.clj trong clojure 1.4.0) , do đó, nó không thể làm bất cứ điều gì để giúp bạn xóa String
khỏi ánh xạ vùng tên.
Cuối cùng, nếu bạn cố gắng xác định lại ánh xạ cho String
với một cái gì đó như là (defn String ...)
trình biên dịch sẽ khiếu nại vì String.class
không phải là một thể hiện của Var
. Xem dòng 6797 của clojure/lang/Compiler.java trong clojure 1.4.0 để biết chi tiết).
Nguồn
2012-03-18 15:04:27
Không gian tên clojure.core phụ thuộc vào nhiều thứ trong java.lang. *, Vì vậy tôi không chắc chắn nên xác định lại các lớp đó ngay cả khi bạn có thể. Ví dụ, 'str',' keyword', 'for', là các hàm và các macro sử dụng lớp' java.lang.String'. –
Tôi nghĩ rằng đây không phải là một vấn đề miễn là đây không phải là macro và sử dụng "String" khi chạy. Tôi cũng có thể loại trừ các hàm clojure.core được sử dụng bởi các hàm khác vì chúng hoàn toàn đủ điều kiện nội bộ. Vì vậy, sử dụng String, khi java.lang.String nội bộ được sử dụng không phải là một vấn đề. –
Trong số tò mò, _why_ bạn có cần đặt tên biến của mình là 'Byte' và' String' không? – Gert