summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lisp/clojure.lisp92
1 files changed, 65 insertions, 27 deletions
diff --git a/src/lisp/clojure.lisp b/src/lisp/clojure.lisp
index 175854de..cba68cd0 100644
--- a/src/lisp/clojure.lisp
+++ b/src/lisp/clojure.lisp
@@ -8,37 +8,74 @@
; * You must not remove this notice, or any other, from this software.
; **/
-(defpackage :clojure)
+(defpackage :clojure
+ (:export :load-types :*namespace-separator*))
+
(in-package :clojure)
-(defvar *package-separator* #\/)
+(defvar *namespace-separator* nil
+ "set to #\/ for JVM, #\. for CLI")
(defun ensure-package (name)
"find the package or create it if it doesn't exist"
(or (find-package name)
(make-package name :use '())))
+
+(defun primitive-name (tn)
+ (or (cdr (assoc tn
+ '(("Z" . "boolean")
+ ("B" . "byte")
+ ("C" . "char")
+ ("S" . "short")
+ ("I" . "int")
+ ("J" . "long")
+ ("F" . "float")
+ ("D" . "double")
+ ("V" . "void"))
+ :test #'string-equal))
+ tn))
+
+(defun java-array-name? (tn)
+ (eql (schar tn 0) #\[))
+
(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)))
- (arity (entry)
- (second (assoc :arity (rest entry))))
- (name (entry)
- (second (assoc :name (rest entry))))
- (simple-name (tn)
- (if (find *package-separator* tn)
- (subseq tn (1+ (position *package-separator* tn :from-end t)))
- tn))
- (sig (entry)
- (format nil "<~{~A~^*~}>~@[~A~]"
- (mapcar #'simple-name (rest (assoc :args (rest entry))))
- (simple-name (second (assoc :ret (rest entry)))))))
+"generates symbols for types/classes and members in supplied typedump file
+ see typedump in the Java/C# side
+ uses *namespace-separator*
+ note that this interns symbols and pushes plist entries on them,
+ is destructive and not idempotent, so delete-package any packages prior to re-running"
+ (unless *namespace-separator*
+ (error "*namespace-separator* must be set"))
+ (labels
+ ((type-name (td)
+ (second (assoc :name td)))
+ (arity (entry)
+ (second (assoc :arity (rest entry))))
+ (name (entry)
+ (second (assoc :name (rest entry))))
+ (simple-name (tn)
+ (when tn
+ (let ((base-name (if (find *namespace-separator* tn)
+ (subseq tn
+ (1+ (position *namespace-separator* tn :from-end t))
+ (position #\; tn :from-end t))
+ (primitive-name (subseq tn (if (java-array-name? tn)
+ (1+ (position #\[ tn :from-end t))
+ 0))))))
+ (if (java-array-name? tn)
+ (with-output-to-string (s)
+ (write-string base-name s)
+ (dotimes (x (1+ (position #\[ tn :from-end t)))
+ (write-string "[]" s)))
+ base-name))))
+ (sig (entry)
+ (format nil "<~{~A~^*~}>"
+ (mapcar #'simple-name (rest (assoc :args (rest entry)))))))
(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))
+ (let* ((split (position *namespace-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))
@@ -55,7 +92,7 @@ see typedump in the Java/C# side"
(:ctor
(let* ((ar (arity entry))
(overloaded (member-if (lambda (e)
- (and (not (eql e entry))
+ (and (not (equal e entry))
(eql (first e) :ctor)
(eql (arity e) ar)))
td))
@@ -71,16 +108,17 @@ see typedump in the Java/C# side"
(let* ((ar (arity entry))
(nm (name entry))
(overloaded (member-if (lambda (e)
- (and (not (eql e entry))
+ (and (not (equal e entry))
(eql (first e) :method)
(string= (name e) nm)
(eql (arity e) ar)))
td))
(method-sym (intern (concatenate 'string
- class-name
- nm
- (when overloaded
- (sig entry)))
- package)))
+ class-name
+ nm
+ (when overloaded
+ (sig entry)))
+ package)))
(export method-sym package)
- (push entry (get method-sym 'type-info))))))))))) \ No newline at end of file
+ (push entry (get method-sym 'type-info)))))))))
+ t)) \ No newline at end of file