2010-01-13 31 views
5

Vì vậy, tôi đang cố gắng để khám phá internals Clojure và tôi đã đi qua một cái gì đó tôi không khá chắc chắn tôi hiểu:Clojure weirdness với Var.intern và RT.var

Từ REPL, tôi có thể truy cập RT .var ("clojure.core", "yêu cầu") tốt (điều này có nghĩa vụ phải trả lại var gắn liền với biểu tượng "yêu cầu" trong "clojure.core" namespace):

user=> (clojure.lang.RT/var "clojure.core" "require") 
#'clojure.core/require 

Tuy nhiên, nếu Tôi cố gắng truy cập vào những gì tôi nghĩ theo cùng một cách (

user=> (clojure.lang.Var/intern (clojure.lang.Namespace/findOrCreate (clojure.lang.Symbol/intern nil "clojure.main")) (clojure.lang.Symbol/intern nil "require")) 
java.lang.IllegalStateException: require already refers to: #'clojure.core/require in namespace: clojure.main (NO_SOURCE_FILE:0) 

Tôi nhận được một lỗi yêu cầu đã đề cập đến một cái gì đó tồn tại. Điều này rất lạ vì RT.var giống với Var.intern, ngoại trừ các đối số được chuyển đổi thành Không gian tên và Biểu tượng tương ứng.

static public Var var(String ns, String name){ 
    return Var.intern(Namespace.findOrCreate(Symbol.intern(null, ns)), Symbol.intern(null, name)); 
} 

Tôi sẽ thực hiện thêm một số công việc đào bới, nhưng tôi khá bối rối về vấn đề này. Tôi đã kiểm tra: 1. nil giống như null 2. Tôi đã tạo var2, trả về đối số vùng tên được gửi tới Var.intern và var3, trả về đối số tên được gửi tới Var.intern. Sau đó tôi chuyển hai loại đó cho Var.intern:

user=> (clojure.lang.Var/intern 
(clojure.lang.RT/var2 "clojure.main" "require") 
(clojure.lang.RT/var3 "clojure.main" "require")) 
java.lang.IllegalStateException: require already refers to: #'clojure.core/require in namespace: clojure.main (NO_SOURCE_FILE:0) 

Đây có phải là lỗi không?

Trả lời

4

này hoạt động tốt:

(clojure.lang.Var/intern 
(clojure.lang.Namespace/findOrCreate 
    (clojure.lang.Symbol/create "clojure.core")) 
(clojure.lang.Symbol/create "require")) 

Symbol/intern công trình cũng:

(clojure.lang.Var/intern 
(clojure.lang.Namespace/findOrCreate 
    (clojure.lang.Symbol/intern nil "clojure.core")) 
(clojure.lang.Symbol/intern nil "require")) 
+0

AH có ... Tôi đã sử dụng clojure.main thay vì clojure.core. Cảm ơn! – Jieren

+1

Bạn được chào đón! Ngẫu nhiên, tôi đã sử dụng 'Symbol/create' thay cho' Symbol/intern', nhưng 'intern' cũng hoạt động ... Tôi đoán tôi sẽ chỉnh sửa nó tốt hơn, vì sợ rằng nó sẽ gây nhầm lẫn cho một số khách truy cập trong tương lai của câu hỏi này. :-) –

+2

Symbol.intern() và Symbol.create() về cơ bản cũng giống như ngày hôm nay. Ban đầu tạo ra sẽ mong đợi chuỗi nội bộ là đối số, nhưng hành vi này đã được thay đổi. Rich đã suy nghĩ về việc loại bỏ create() tại một số điểm trong tương lai. – liwp

0

Các REPL chỉ là clojure.main, vì vậy chúng tôi không thể thực tập clojure.main/yêu cầu trong một REPL, nhưng clojure .core/yêu cầu, tôi nghĩ!