comparison src/clojure/contrib/ns_utils.clj @ 10:ef7dbbd6452c

added clojure source goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 21 Aug 2010 06:25:44 -0400
parents
children
comparison
equal deleted inserted replaced
9:35cf337adfcf 10:ef7dbbd6452c
1 ;; Copyright (c) Stephen C. Gilardi. All rights reserved. The use and
2 ;; distribution terms for this software are covered by the Eclipse Public
3 ;; License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can
4 ;; be found in the file epl-v10.html at the root of this distribution. By
5 ;; using this software in any fashion, you are agreeing to be bound by the
6 ;; terms of this license. You must not remove this notice, or any other,
7 ;; from this software.
8
9 ;; scgilardi (gmail)
10 ;; 23 April 2008
11
12 ;; DEPRECATED in 1.2: dir and print-dir. Use dir and dir-fn in
13 ;; clojure.repl.
14
15 (ns
16 ^{:author "Stephen C. Gilardi",
17 :doc "Namespace utilities
18
19 get-ns returns the namespace named by a symbol or throws
20 if the namespace does not exist
21
22 ns-vars returns a sorted seq of symbols naming public vars
23 in a namespace
24
25 print-docs prints documentation for the public vars in a
26 namespace
27
28 immigrate Create a public var in this namespace for each
29 public var in the namespaces named by ns-names.
30 From James Reeves
31
32 vars returns a sorted seq of symbols naming public vars
33 in a namespace (macro)
34
35 docs prints documentation for the public vars in a
36 namespace (macro)"}
37 clojure.contrib.ns-utils
38 (:use clojure.contrib.except))
39
40 ;; Namespace Utilities
41
42 (defn get-ns
43 "Returns the namespace named by ns-sym or throws if the
44 namespace does not exist"
45 [ns-sym]
46 (let [ns (find-ns ns-sym)]
47 (throw-if (not ns) "Unable to find namespace: %s" ns-sym)
48 ns))
49
50 (defn ns-vars
51 "Returns a sorted seq of symbols naming public vars in
52 a namespace"
53 [ns]
54 (sort (map first (ns-publics ns))))
55
56 (defn print-dir
57 "Prints a sorted directory of public vars in a namespace"
58 {:deprecated "1.2"}
59 [ns]
60 (doseq [item (ns-vars ns)]
61 (println item)))
62
63 (defn print-docs
64 "Prints documentation for the public vars in a namespace"
65 [ns]
66 (doseq [item (ns-vars ns)]
67 (print-doc (ns-resolve ns item))))
68
69 ;; Convenience
70
71 (defmacro vars
72 "Returns a sorted seq of symbols naming public vars in
73 a namespace"
74 [nsname]
75 `(ns-vars (get-ns '~nsname)))
76
77 (defmacro dir
78 "Prints a sorted directory of public vars in a namespace"
79 {:deprecated "1.2"}
80 [nsname]
81 `(print-dir (get-ns '~nsname)))
82
83 (defmacro docs
84 "Prints documentation for the public vars in a namespace"
85 [nsname]
86 `(print-docs (get-ns '~nsname)))
87
88 (defn immigrate
89 "Create a public var in this namespace for each public var in the
90 namespaces named by ns-names. The created vars have the same name, root
91 binding, and metadata as the original except that their :ns metadata
92 value is this namespace."
93 [& ns-names]
94 (doseq [ns ns-names]
95 (require ns)
96 (doseq [[sym var] (ns-publics ns)]
97 (let [sym (with-meta sym (assoc (meta var) :ns *ns*))]
98 (if (.hasRoot var)
99 (intern *ns* sym (.getRoot var))
100 (intern *ns* sym))))))