aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/import_static.clj
diff options
context:
space:
mode:
authorscgilardi <scgilardi@gmail.com>2008-11-13 18:55:39 +0000
committerscgilardi <scgilardi@gmail.com>2008-11-13 18:55:39 +0000
commit04eb37e3ebb622e2799f1a6be48dd8054495620f (patch)
tree6dfe1cc2a34b453a0f79b396741da39e2ce72ed5 /src/clojure/contrib/import_static.clj
parentf0ce2b7230177b8580bbcf0851790582a1d5e91b (diff)
minimal port to Clojure SVN 1094+ of seq-utils import-static trace enum javalog duck-streams str-utils. (they all load again)
Diffstat (limited to 'src/clojure/contrib/import_static.clj')
-rw-r--r--src/clojure/contrib/import_static.clj60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/clojure/contrib/import_static.clj b/src/clojure/contrib/import_static.clj
new file mode 100644
index 00000000..c8015c8a
--- /dev/null
+++ b/src/clojure/contrib/import_static.clj
@@ -0,0 +1,60 @@
+;;; import_static.clj -- import static Java methods/fields into Clojure
+
+;; by Stuart Sierra, http://stuartsierra.com/
+;; June 1, 2008
+
+;; Copyright (c) 2008 Stuart Sierra. All rights reserved. The use and
+;; distribution terms for this software are covered by the Common
+;; Public License 1.0 (http://www.opensource.org/licenses/cpl1.0.php)
+;; which can be found in the file CPL.TXT 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 clojure.contrib.import-static
+ (:use clojure.set))
+
+(defmacro import-static
+ "Imports the named static fields and/or static methods of the class
+ as (private) symbols in the current namespace.
+
+ Example:
+ user=> (import-static java.lang.Math PI sqrt)
+ nil
+ user=> PI
+ 3.141592653589793
+ user=> (sqrt 16)
+ 4.0
+
+ Note: The class name must be fully qualified, even if it has already
+ been imported. Static methods are defined as MACROS, not
+ first-class fns."
+ [class & fields-and-methods]
+ (let [only (set (map str fields-and-methods))
+ the-class (. Class forName (str class))
+ static? (fn [x]
+ (. java.lang.reflect.Modifier
+ (isStatic (. x (getModifiers)))))
+ statics (fn [array]
+ (set (map (memfn getName)
+ (filter static? array))))
+ all-fields (statics (. the-class (getFields)))
+ all-methods (statics (. the-class (getMethods)))
+ fields-to-do (intersection all-fields only)
+ methods-to-do (intersection all-methods only)
+ make-sym (fn [string]
+ (with-meta (symbol string) {:private true}))
+ import-field (fn [name]
+ (list 'def (make-sym name)
+ (list '. class (symbol name))))
+ import-method (fn [name]
+ (list 'defmacro (make-sym name)
+ '[& args]
+ (list 'list ''. (list 'quote class)
+ (list 'apply 'list
+ (list 'quote (symbol name))
+ 'args))))]
+ `(do ~@(map import-field fields-to-do)
+ ~@(map import-method methods-to-do))))