aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/enum.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/enum.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/enum.clj')
-rw-r--r--src/clojure/contrib/enum.clj46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/clojure/contrib/enum.clj b/src/clojure/contrib/enum.clj
new file mode 100644
index 00000000..1986387d
--- /dev/null
+++ b/src/clojure/contrib/enum.clj
@@ -0,0 +1,46 @@
+;;; enum.clj -- Java enum classes in Clojure
+
+;; by Stuart Sierra, http://www.stuartsierra.com/
+;; May 29, 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.
+
+
+;; This file helps define Java Enums, introduced in Java 1.5. Use it
+;; when you need to define an enum to pass to a Java method.
+;;
+;; This file depends on genclass.clj in the Clojure distribution.
+
+
+(ns clojure.contrib.enum)
+
+(defmacro defenum
+ "Generates and loads a subclass of java.lang.Enum, then
+ defs symbols as enumerated instances of that class.
+
+ Example: (defenum my.package.MyEnum FOO BAR)
+ ;; FOO and BAR are now instances of MyEnum
+
+ Java equivalent: enum MyEnum { FOO, BAR };
+
+ Caveats:
+ 1. The generated class has no values() method.
+ 2. The generated class returns false for Class.isEnum().
+ 3. Enum.valueOf(Class, String) will not work.
+ 4. Redefining an enum is allowed, but enumeration resets
+ to zero."
+ [class & symbols]
+ ;; Can't load a class twice, so check first:
+ (try (. Class (forName (str class)))
+ (catch java.lang.ClassNotFoundException e
+ (gen-and-load-class (str class) :extends java.lang.Enum)))
+ (cons 'do
+ (map (fn [sym val]
+ `(def ~sym (new ~class ~(str sym) ~val)))
+ symbols (iterate inc 0))))