2012-03-18 29 views
7

Có khả năng loại trừ các tên lớp khỏi java.lang trong không gian tên Clojure không?Loại trừ java.lang. * Trong không gian tên Clojure

Tôi cần phải sử dụng các biến như Byte và String, và ở đây các tên lớp java.lang đi vào con đường của tôi.

có thể giống như (ns my-ns (: loại trừ java.lang))?

+1

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

+1

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

+0

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

Trả lời

8

Nếu bạn sử dụng tên đầy đủ, không có sự mơ hồ. Ví dụ:

user=> (def user/Byte (java.lang.Byte/decode "0")) 
#'user/Byte 

Sau khi bạn đã xác định Byte theo cách này, Byte sẽ giải quyết để định nghĩa của bạn mà không sự cần thiết phải hội đủ điều kiện tên

user=> Byte 
0 
1

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

1

Điều này chắc chắn là có thể nếu bạn tự loại bỏ bản đồ được tích hợp sẵn trong java.lang.String trước khi tạo bản đồ của riêng bạn:

$ cake repl 
repl-1=> (def String 1) 
java.lang.Exception: Expecting var, but String is mapped to class java.lang.String (NO_SOURCE_FILE:1) 
repl-1=> (ns-unmap *ns* 'String) 
nil 
repl-1=> (def String 1) 
#'repl-1/String 
repl-1=> String 
1 

Tôi sẽ lặp lại một số nhận xét khác, xác định một cái gì đó được đặt tên String không có khả năng làm cho cuộc sống của bạn dễ chịu/thuận tiện.

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