2010-06-07 21 views
9

Tôi có nên cảm thấy thận trọng khi tạo các từ khóa clojure có các không gian tên không tồn tại?Có vấn đề gì với việc đặt tên các từ khóa clojure trong một không gian tên không tồn tại?

Ví dụ: foo/bar, nơi không gian tên foo không thực sự tồn tại. Điều này có vẻ là có thể bởi vì những từ khóa này hoạt động giống như chữ. Tôi không thể tìm thấy bất kỳ vấn đề làm điều này trong REPL, nhưng tôi lo ngại về các vấn đề có thể với việc biên dịch AOT.

+1

Tôi đã làm điều này cho những điều nhất định trong quá khứ và không có bất kỳ vấn đề nào. –

Trả lời

7

Một namespace sẽ trên thực tế không được tạo ra đơn giản chỉ vì một từ khóa hoặc ký hiệu được gặp đó sẽ "thuộc" với nó, như sự tương tác sau tại một REPL tươi minh họa:

; SLIME 2010-05-06 
user> (-> (.getNamespace :user/foo) symbol) 
user 
user> (-> (.getNamespace :user/foo) symbol the-ns) 
#<Namespace user> 
user> (-> (.getNamespace :bar/foo) symbol the-ns) 
; java.lang.Exception: No namespace: bar found 

Tuy nhiên, điều này không phải lo lắng. Trường "không gian tên" của biểu tượng hoặc từ khóa chỉ là một chuỗi được thực hiện; không có tham chiếu quay lại đối tượng vùng tên tương ứng có liên quan ngay cả khi có tồn tại. Trên thực tế, như có thể thấy ở trên, phương thức từ khóa và ký hiệu .getNamespace trả về một chuỗi và một từ phải nhảy một vài bước nhảy để đến vùng tên thực tế từ đó.

Cố gắng giải quyết một biểu tượng đủ điều kiện không gian tên với chức năng resolve cũng an toàn. Đó là bất kể không gian tên thực sự tồn tại; nếu không, nil sẽ được trả lại, như trong trường hợp nó tồn tại, nhưng không giữ Var của tên đã cho. Ngược lại, ns-resolve sẽ ném một ngoại lệ như trường hợp được đề cập trong đoạn trích từ REPL ở trên nếu nó không thể tìm thấy không gian tên đã cho.

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