2010-04-30 21 views
51

Clojure ad alanının tüm işlevlerinin nasıl listeleneceğini bilmek istiyorum. Biraz araştırma yaptım ama henüz orada değilim. Böyle şov yöntemi denedimAd alanının işlevleri nasıl listelenir?

(show java.awt.Graphics) 

bir Clojure ad fonksiyonlarını listelemek için:

(show 'clojure.contrib.repl-utils) 

Zaten gösteri yöntemini kullanarak bir Java sınıfı yöntemlerini listelemek nasıl bulundu Bu, bazı Java sınıf yöntemlerini gösterir, ancak ben doc ve show gibi arıyorum. Bunları nasıl alabilirim?

cevap

75

Normalde ad foo tarafından ihraç Vars Listeye

(keys (ns-publics 'foo)) 

diyoruz; Örneğin. clojure.contrib.monads için bu

(defmonad censor m-when-not m+write+m maybe-m maybe-t ...) 

(oldukça çok daha ... stantlar) döndürür.

Daha genel isimler ekli bazı ek kriterler, ad tarafından Vars listelemek ns- başlayacak fonksiyonları bir demet var:

  1. ns-map - tüm en genel işlevi, anahtarlı bir harita döndürür sembollerle (isim-alanı olmayan kalifiye semboller), her sembole karşılık gelen değer, sembolün verilen isim alanında var olan Var mı yoksa sınıf mı olduğu ile.

  2. ns-interns - ns-map gibi ama içerir nedeniyle sadece bir use veya refer çağrı veya Vars örtülü yönlendirmenin verilen ad erişilebilir diğer ad gelen Vars karşıt olarak (belirli bir ad enterne Vars . clojure.core

  3. ns-publics - ns-interns gibi ama kapsamaktadır sadece özel olmayan Vars

  4. ns-imports -. ns-map gibi ama sadece girişleri wh içerir ose değerleri Java sınıflarına karşılık gelir.

da diğer ad gelen Vars atıfta bulunulduğunda kestirme diğer adlar olarak kullanılabilir sembolleri listeler ns-aliases yoktur; Örneğin. (require '[clojure.contrib.math :as math]), ns-aliases numaralı telefonu arayarak math (sembol) anahtarını içeren bir giriş içerecektir, bu değer gerçek ad alanı clojure.contrib.math olacaktır. Bu eşleme, ns-map tarafından döndürülen haritaya dahil değildir.

+0

Bu işlevlerin ve "doc" işlevlerinin kullanılabilirliği, eski kitaplıklar ve diğer paketler için belgelerin sağlanmasının neden çok yüksek bir önceliğe sahip olmadığının bir sebebi midir? –

6

here'a bakın. Daha spesifik olarak:

;; Sometimes I like to ask which public functions a namespace provides. 
(defn- ns-publics-list [ns] (#(list (ns-name %) (map first (ns-publics %))) ns)) 
47

dir'u kullanabilirsiniz. (Bu soru ilk sorulduğunda kullanılabilir değildi.

user=> (dir clojure.string) 
blank? 
capitalize 
escape 
join 
lower-case 
re-quote-replacement 
replace 
replace-first 
reverse 
split 
split-lines 
trim 
trim-newline 
triml 
trimr 
upper-case 
nil 
+0

bildirmek için: bir şekilde clojure 1.4 '(dir * ns *)' çalışmıyor, '' Exception No namepace: * ns * bulundu clojure.core/the-ns (core.clj: 3691) ' – xealits

+1

@xeslits, I ' Eminim haklısın. Cevabımdaki "dir" belgelerine giden bağlantıyı takip ederseniz, bir köşede "dir" in Clojure 1.6'da tanıtıldığını belirten bir bildirim var. Cevabını yayınladığım sırada belki bu bilgiyi eklemiş olmalıyım. Bu noktada, v. 1.5 zaten geçerli sürümün arkasında üç versiyon. 1.5 veya 1.4'ü kullanmak için iyi nedenleri olan insanlar olsa da, bu vakaların nadir olduğunu düşünüyorum. – Mars

+2

@xealits @Mars Bunun sürümle ilgisi yok. Sadece isim alanının gerçek sembolünü sağlamanız gerekiyor: '(dir-gerçek-isim-alanı)' 'No namespace 'i alırken Clojure 1.8'de gayet iyi çalışır:' ns * 'hata yaparsam denerim (dir * ns *) '. –

0

Saatin tersi yönde kullananlar için, varsayılan olarak gösterilen bir "Ad Alanı Tarayıcısı" vardır.

görünmüyorsa, bu menü seçeneği aracılığıyla gösterilebilir:

Window> Show Görünüm> Ad alanı Tarayıcı

Resmi belgeler: Resmi belgelerinden http://doc.ccw-ide.org/documentation.html#_namespace_browser_view

alıntı:

Ad Alanı Tarayıcı Görünümü, 'un tüm ad alanlarının tüm sembollerini aktif REPL [2] görüntüler. İlgili dosyalarda (iç kavanozlar dahil) sembollerinin tanımına atlamanıza izin verir: sadece İsim Alanı Tarayıcı Görünümünde sembol adına çift tıklayın.

İlgili konular