2012-03-18 24 views
7

bir Clojure ad alanında java.lang gelen classnames dışlamak için bir olasılık var mı?. * Clojure ad alanında

Byte ve String gibi değişkenler kullanmam gerekiyor ve burada java.lang sınıf adları yoluma geliyor.

belki bir şey gibi (ns my-ns (: exclude java.lang))?

+1

clojure.core ad alanı, java.lang. * Içinde çok sayıda içeriğe bağlıdır. Bu yüzden, bu sınıfları bile yeniden tanımlamak iyi bir fikir olduğundan emin değilim. Örneğin, "str", "keyword", "for", "java.lang.String" sınıfını kullanan işlevler ve makrolardır. –

+1

Bu, makro değil ve çalışma zamanında "Dize" kullanıldıkları sürece bu bir sorun olmamalı. Dahili olarak tamamen nitelikli olduklarından, diğer işlevler tarafından kullanılan clojure.core işlevlerini de hariç tutabilirim. Yani, içte java.lang.String kullanıldığında String kullanıldığında sorun olmamalı. –

+0

Merak etme, _why_ 'Byte' ve 'String' değişkenlerinizi adlandırmanız gerekiyor mu? – Gert

cevap

8

Tam nitelikli ad kullanırsanız, belirsizlik olmaz. Örneğin:

bu şekilde Byte tanımladıktan sonra
user=> (def user/Byte (java.lang.Byte/decode "0")) 
#'user/Byte 

, Byte Adını nitelemek olmadan tanımına ihtiyacını çözer

user=> Byte 
0 
1

Sorunun kesin cevabını bilmiyorum, ancak eğitimli tahminim, clojure'un kendisini değiştirmeden yapamayacağınızdır. İşte benim analizi açıklanmıştır:

String sembol varsayılan eşleştirmeleri (clojure/lang/RT.java sınıfta DEFAULT_MAPPINGS başvuran bu sınıfta, içinde Namespace yapıcısı bakınız) bir parçası olarak clojure/lang/Namespace.java içinde enterne edilmiştir. Interning, Namespace sınıfının mappings üye değişkeninde bir anahtar bulunduğu anlamına gelir. Bunun neticesinde, adında her ad alanı, String.class ile eşlenen String ile başlar (clojure 1.4.0'da RT.java'nın 77. satırına bakın). Gelen

ns makro, gibi bir şey yapabilirsiniz: (Clojure 1.4.0 yılında Clojure/core.clj hattı 3770 bakınız)

(ns my-ns 
    (:refer-clojure :exclude [<mapping to exclude>])) 

ama yaptığı tüm yeni semboller stajyerler kod atlamak olduğunu Bu nedenle, ad alanı eşlemelerinden String'u kaldırmanıza yardımcı olacak hiçbir şey yapamaz. Bir (defn String ...) gibi bir şeyle String için eşleme yeniden tanımlamak denerseniz String.classVar örneğidir olmadığı için

Son olarak, derleyici şikayet edecektir. Ayrıntılar için clojure 1.4.0 içinde clojure/lang/Compiler.java satır 6797 bakın.

1

el kaldırırsanız, bu kesinlikle mümkü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 

ama diğer bazı yorumlar yankı edeceğiz tanımlayarak bu: kendi oluşturmadan önce java.lang.String için haritalama yerleşik String isimli bir şeyin hayatınızı keyifli/uygun hale getirmesi pek olası değildir.

İlgili konular