summaryrefslogtreecommitdiff
path: root/src/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/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