summaryrefslogtreecommitdiff
path: root/src/lisp/clojure.lisp
blob: 28fe3106d8ba71336a5c85b71ae1de048775980c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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))))))))))