diff options
Diffstat (limited to 'src/lisp')
-rw-r--r-- | src/lisp/clojure.lisp | 32 |
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 |