summaryrefslogtreecommitdiff
path: root/src/lisp/clojure.lisp
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-04-11 22:00:12 +0000
committerRich Hickey <richhickey@gmail.com>2006-04-11 22:00:12 +0000
commit30a0f7dfd9caddc149fda7ddff9c211f6cdbf4ff (patch)
tree8b3a283a2b3388dda1db76814d0eb6c607bc6053 /src/lisp/clojure.lisp
parent5c55b8c7cf098da420db04ca7c12d1bfb7240cd7 (diff)
added clojure.lisp
Diffstat (limited to 'src/lisp/clojure.lisp')
-rw-r--r--src/lisp/clojure.lisp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/lisp/clojure.lisp b/src/lisp/clojure.lisp
new file mode 100644
index 00000000..28fe3106
--- /dev/null
+++ b/src/lisp/clojure.lisp
@@ -0,0 +1,32 @@
+(defpackage :clojure)
+(in-package :clojure)
+
+(defvar *package-separator* #\/)
+
+(defun ensure-package (name)
+ "find the package or create it if it doesn't exist"
+ (or (find-package name)
+ (make-package name :use '())))
+
+(defun load-types (type-file)
+"generates symbols for types/classes and members in supplied file
+see typedump in the Java/C# side"
+ (labels ((type-name (td)
+ (second (assoc :name td))))
+ (let ((type-descriptors (with-open-file (f type-file)
+ (read f))))
+ (dolist (td type-descriptors)
+ (let* ((split (position *package-separator* (type-name td) :from-end t))
+ (package-name (subseq (type-name td) 0 split))
+ (class-name (string-append (subseq (type-name td) (1+ split)) "."))
+ (package (ensure-package package-name))
+ (class-sym (intern class-name package)))
+ (export class-sym package)
+ (dolist (entry td)
+ (case (first entry)
+ (:field
+ (let ((field-sym (intern (string-append class-name
+ (second (assoc :name (rest entry))))
+ package)))
+ (export field-sym package)
+ (setf (get field-sym 'type-info) entry)))))))))) \ No newline at end of file