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