diff src/rlm/ns_rlm.clj @ 0:78a630e650d2

initial import
author Robert McIntyre <rlm@mit.edu>
date Tue, 18 Oct 2011 00:57:08 -0700
parents
children 8565803376a4
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/rlm/ns_rlm.clj	Tue Oct 18 00:57:08 2011 -0700
     1.3 @@ -0,0 +1,40 @@
     1.4 +(ns rlm.ns-rlm
     1.5 +  "A few convienence functions for namespaces."
     1.6 +  (:use [clojure.contrib [ns-utils :only [get-ns]]]))
     1.7 +
     1.8 +(defn ns-clear
     1.9 +  "completely removes all aliases, interns, and references from the namespace
    1.10 +     works on *ns* if called with no arguments"
    1.11 +  ([ns]
    1.12 +     (let [ns (the-ns ns)]
    1.13 +       (doall (map (partial ns-unmap ns) (keys (ns-map ns))))
    1.14 +       (doall (map (partial ns-unalias ns) (keys (ns-aliases ns)))) nil))
    1.15 +    ([] (ns-clear *ns*)))
    1.16 +
    1.17 +(defn ns-clone-fn
    1.18 +  "the calling namespace (*ns*) gets all the referenced vars as the target namespace
    1.19 +     anything that the target namespace doesn't have, ns won't have.  Anything it does
    1.20 +     have, *ns* will have."
    1.21 +  [target-ns]
    1.22 +  (ns-clear *ns*)
    1.23 +  (doall (map (fn [[ns-alias ns]] (alias ns-alias (.name ns))) (ns-aliases target-ns)))
    1.24 +  (doall (map (fn [[sym var]]
    1.25 +		(cond (var? var)
    1.26 +		      (. *ns* (refer sym var))
    1.27 +		      (class? var) 
    1.28 +		      (. *ns* (importClass var))))
    1.29 +		      ;;(eval `(clojure.core/import*  ~(.getName var)))))
    1.30 +		  (ns-map target-ns))) nil)
    1.31 +
    1.32 +(defmacro ns-clone
    1.33 + ([target-ns-name]
    1.34 +    `(do
    1.35 +       (require '~target-ns-name)
    1.36 +       (ns-clone-fn (get-ns '~target-ns-name)))))
    1.37 +
    1.38 +(defn ls
    1.39 +  "lists all the vars defined in the namespace"
    1.40 +  ([ns] (doall (map println (keys (ns-map ns)))) nil)
    1.41 +  ([] (ls *ns*)))
    1.42 +
    1.43 +