diff options
author | scgilardi <scgilardi@gmail.com> | 2008-11-13 18:55:39 +0000 |
---|---|---|
committer | scgilardi <scgilardi@gmail.com> | 2008-11-13 18:55:39 +0000 |
commit | 04eb37e3ebb622e2799f1a6be48dd8054495620f (patch) | |
tree | 6dfe1cc2a34b453a0f79b396741da39e2ce72ed5 /src/clojure/contrib/enum.clj | |
parent | f0ce2b7230177b8580bbcf0851790582a1d5e91b (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.clj | 46 |
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)))) |