clojureの中を覗く

    • classpathのリスト
    • 現在のnamespaceで利用できる関数
    • classが持っているmethod

classpath

clojurejavaのSystemClassLoader以外のところにclasspathを格納していた。

(defn current-classpath []
  (let [xs (list (.. java.lang.ClassLoader getSystemClassLoader getURLs)
		 (.. clojure.lang.RT getRootClassLoader getURLs))]
    (apply concat  (map (fn [urls] (map #(. % getFile) urls)) xs))))

;;how-to-use
;(current-classpath)

現在利用できる関数の表示

(defn usable-functions
  ([]  (usable-functions *ns*))
  ([ns] ((comp keys ns-map) ns)))

;;how-to-use
;(usable-functions)
;(usable-functions (fisrt (all-ns)))

classの情報を調べる

(defn class-info [k]
  (letfn [(get-method-info [m]
	   {:name (. m getName)
	    :args (map class-simple (. m getParameterTypes))
	    :return-type (class-simple (. m getReturnType))})
	  (class-simple [k] (let [k* (. k getSimpleName)]
			      (if (= "Object" k*) "o" k*)))]
    (let [k (if (class? k) k (class k))]
      {:class k
       :methods (sort-by #(:name %) (map get-method-info (. k getMethods)))})))

(defn describe-class [k]
  (let [table (class-info k)]
    (println "==" (:class table) "==")
    (doseq [x (:methods table)] (println x))))

;;how-to-use
;(describe-class (type #""))