2011-12-08 14 views
15

क्लोजर में आत्मनिरीक्षण करने का सबसे अच्छा तरीका क्या है? क्या पाइथन के dir फ़ंक्शन की तरह कुछ है? मैं जावा क्लास पर उपलब्ध विधियों को खोजने में विशेष रूप से रूचि रखता हूं जिनके साथ मैं इंटरऑपरेट कर रहा हूं, लेकिन मुझे आत्मनिरीक्षण से संबंधित क्लोजर में उपलब्ध कुछ भी खोजने में भी रूचि है।क्लोजर में आत्मनिरीक्षण

+1

शायद clojure.reflect रूप में अच्छी तरह जांच कर रहे लायक है। http://clojure.github.io/clojure/clojure.reflect-api।एचटीएमएल – claj

उत्तर

10

आप तरीकों की खोज करना चाहते हैं, सिर्फ सादा जावा प्रतिबिंब का उपयोग करें:

(-> {:a 1} .getClass .getDeclaredMethods pprint) 

या

(-> clojure.lang.PersistentArrayMap .getDeclaredMethods pprint) 
:

user=> (.getDeclaredMethods (.getClass {:a 1})) 
#<Method[] [Ljava.lang.reflect.Method;@72b398da> 
user=> (pprint *1) 
[#<Method private int clojure.lang.PersistentArrayMap.indexOf(java.lang.Object)>, 
#<Method public int clojure.lang.PersistentArrayMap.count()>, 
#<Method public java.util.Iterator clojure.lang.PersistentArrayMap.iterator()>, 
#<Method public boolean clojure.lang.PersistentArrayMap.containsKey(java.lang.Object)>, 
#<Method public int clojure.lang.PersistentArrayMap.capacity()>, 
#<Method public clojure.lang.IPersistentMap clojure.lang.PersistentArrayMap.empty()>, 
... 

आप भी इसे एक छोटे से अच्छे एक सूत्रण मैक्रो के साथ लिख सकते हैं

(मैंने अभी #clojure आईआरसी से सीखा है कि कक्षा का नाम पहले से ही क्लास ऑब्जेक्ट है!)

+0

'(.getDeclaredMethods (कक्षा {: ए 1})) 'काम भी करता है। – Mars

11

यदि आप 1.3 का उपयोग कर रहे हैं, तो clojure.reflect है जो आपको जावा कक्षाओं के बारे में जानकारी का निरीक्षण, कुशलतापूर्वक इत्यादि की अनुमति देता है। मैं पुराने contrib से clojure.contrib.repl-utils/show का भी शौकीन हूं यदि यह आपके लिए एक विकल्प है।

3

विशेष रूप से clojure.contrib.repl-utils, और show देखें।

http://richhickey.github.com/clojure-contrib/repl-utils-api.html#clojure.contrib.repl-utils/show

ये आप आरईपीएल में वस्तुओं और कक्षाओं आत्मनिरीक्षण करने के लिए उपयोगिताओं रहे हैं, लेकिन कोड कैसे प्रोग्राम के वर्गों का पता लगाने के का एक अच्छा उदाहरण है।

15

मिचिल बोर्केंट और डेव रे में इंटरऑप विकल्प शामिल हैं।

क्लोजर फ़ंक्शंस की खोज के लिए, clojure.repl नामस्थान में कुछ विकल्प हैं (जो पहले से ही आपके आरपीएल में डिफ़ॉल्ट रूप से संदर्भित हैं)।

dir:

=> (require 'clojure.set) 
nil 
=> (dir clojure.set) 
difference 
index 
intersection 
join 
map-invert 
project 
rename 
rename-keys 
select 
subset? 
superset? 
union 

apropos:

=> (apropos #"^re-") 
(re-pattern re-matches re-matcher re-groups re-find re-seq) 

find-doc:

=> (find-doC#"^re-") 
------------------------- 
clojure.core/re-find 
([m] [re s]) 
    Returns the next regex match, if any, of string to pattern, using 
    java.util.regex.Matcher.find(). Uses re-groups to return the 
    groups. 
------------------------- 
clojure.core/re-groups 
([m]) 
    Returns the groups from the most recent match/find. If there are no 
    nested groups, returns a string of the entire match. If there are 
    nested groups, returns a vector of the groups, the first element 
    being the entire match. 
------------------------- 
.... 
3

एक वर्ग द्वारा कार्यान्वित इंटरफेस ढूंढने के लिए, कोशिश supers

(supers clojure.lang.PersistentHashMap)

3

clojure.contrib.repl-utilsclojure.reflect ले जाया गया है।

अब आप निम्नलिखित के रूप में यह कॉल कर सकते हैं:

(->> (clojure.reflect/reflect java.lang.String) 
    :members 
    clojure.pprint/pprint) 

https://stackoverflow.com/a/17974908/262425

संबंधित मुद्दे