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