summaryrefslogtreecommitdiff
path: root/src/lisp/clojure.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lisp/clojure.lisp')
-rw-r--r--src/lisp/clojure.lisp53
1 files changed, 48 insertions, 5 deletions
diff --git a/src/lisp/clojure.lisp b/src/lisp/clojure.lisp
index 55693909..e193ac63 100644
--- a/src/lisp/clojure.lisp
+++ b/src/lisp/clojure.lisp
@@ -35,7 +35,7 @@
(defvar *accessors*)
(defvar *defvars*)
(defvar *defns*)
-(defvar *quoted-aggregates*)
+(defvar *quoted-aggregates* nil)
(defvar *nested-fn-bindings*)
(defvar *var-env* nil)
(defvar *frame* nil)
@@ -376,7 +376,7 @@
(defun analyze-op (context op form)
(case op
- (|quote| (analyze-quote context form))
+ (quote (analyze-quote context form))
(|defn*| (analyze-defn* context form))
(|def| (analyze-def context form))
(|block| (analyze-block context form))
@@ -422,7 +422,8 @@
(:loop (emit-loop context expr))
(:break (emit-break context expr))
(:try (emit-try context expr))
- (:bind(emit-bind context expr))))
+ (:bind(emit-bind context expr))
+ (:quoted-aggregate (emit-quoted-aggregate context expr))))
(t (emit-other context expr))))
(defun emit-other (context expr)
@@ -439,7 +440,19 @@
(case expr
(0 (format t "Num.ZERO"))
(1 (format t "Num.ONE"))
- (t (format t "Num.from(~A)" expr))))))))
+ (t (format t "Num.from(~A)" expr))))
+ ((symbolp expr)
+ (cond
+ ((keywordp expr)
+ (format t "~A" (keyword-member-name expr)))
+ ((accessor? expr)
+ (format t "~A" (accessor-member-name expr)))
+ (t (format t "~A" (var-member-name expr)))))
+ ((consp expr)
+ (format t "RT.arrayToList(new Object[]{~{~A~^, ~}})"
+ (mapcar (lambda (e)
+ (emit-to-string (emit :expression e)))
+ expr)))))))
(defun emit-return (expr)
(format t "return ")
@@ -447,6 +460,33 @@
(format t ";~%"))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; quote ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun analyze-quote (context form)
+ (let ((q (second form)))
+ (cond
+ ((symbolp q)
+ (cond
+ ((keywordp q)
+ (register-keyword-reference q))
+ ((host-symbol? q) (error "Can't quote host symbols"))
+ ((accessor? q)
+ (register-accessor-reference q))
+ (t (register-var-reference q)))
+ q)
+ ((atom q) q)
+ (t
+ (let* ((ql (newobj :type :quoted-aggregate :symbol (gensym "QA__") :form q)))
+ (register-quoted-aggregate ql)
+ ql)))))
+
+(defun emit-quoted-aggregate (context expr)
+ (ccase context
+ (:return (emit-return expr))
+ (:expression
+ (format t "~A" (munge-name (@ :symbol expr))))))
+
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun analyze-set (context form)
@@ -524,7 +564,7 @@
;optimize macro-generated (if t ...) forms
(analyze context (macroexpand (third form)))
(let* ((test (analyze :expression (macroexpand (second form))))
- (negate (eql :not (@ :type test))))
+ (negate (and (hash-table-p test)(eql :not (@ :type test)))))
(newobj :type :if
:test (if negate (@ :expr test) test)
:comp (if negate "==" "!=")
@@ -1266,6 +1306,9 @@
(defun register-var-reference (sym)
(pushnew sym *vars*))
+(defun register-quoted-aggregate (qa)
+ (pushnew qa *quoted-aggregates*))
+
(defun register-accessor-reference (sym)
(pushnew sym *accessors*))