diff options
author | Rich Hickey <richhickey@gmail.com> | 2006-05-08 17:11:58 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2006-05-08 17:11:58 +0000 |
commit | 5fc1edd4ce80742aadd48949f6b09d3b3b810ccf (patch) | |
tree | ae5cd4545f971e8c7f7a469bfb936ba07c9eeef5 /src | |
parent | 393b6fcf74aa8e27adce220d15d0b12be1d8ce1c (diff) |
added casts
Diffstat (limited to 'src')
-rw-r--r-- | src/lisp/clojure.lisp | 25 | ||||
-rw-r--r-- | src/lisp/test.lisp | 5 |
2 files changed, 27 insertions, 3 deletions
diff --git a/src/lisp/clojure.lisp b/src/lisp/clojure.lisp index cf243c82..135d326a 100644 --- a/src/lisp/clojure.lisp +++ b/src/lisp/clojure.lisp @@ -16,7 +16,8 @@ "if" "and" "or" "not" "when" "unless" "block" "let" "let*" "letfn" "set" "pset" "set*" "do" - "try" "ex")) + "try" "ex" + "char" "boolean" "byte" "short" "int" "long" "float" "double")) (in-package "clojure") @@ -393,6 +394,8 @@ (|break| (analyze-break context form)) (|try| (analyze-try context form)) (|bind| (analyze-bind context form)) + ((|char| |boolean| |byte| |short| |int| |long| |float| |double|) + (analyze-cast context form)) (t (analyze-invoke context op form)))) (defmacro emit-to-string (&body body) @@ -423,7 +426,8 @@ (:break (emit-break context expr)) (:try (emit-try context expr)) (:bind(emit-bind context expr)) - (:quoted-aggregate (emit-quoted-aggregate context expr)))) + (:quoted-aggregate (emit-quoted-aggregate context expr)) + (:cast (emit-cast context expr)))) (t (emit-other context expr)))) (defun emit-other (context expr) @@ -487,6 +491,23 @@ (format t "~A" (munge-name (@ :symbol expr)))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cast ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun analyze-cast (context form) + (declare (ignore context)) + (newobj :type :cast + :to (first form) + :expr (analyze :expression (macroexpand (second form))))) + +(defun emit-cast (context expr) + (ccase context + (:return (emit-return expr)) + (:expression + (format t "RT.box(RT.~ACast(" (symbol-name (@ :to expr))) + (emit :expression (@ :expr expr)) + (format t "))")))) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun analyze-set (context form) diff --git a/src/lisp/test.lisp b/src/lisp/test.lisp index d40f4176..2482fdf6 100644 --- a/src/lisp/test.lisp +++ b/src/lisp/test.lisp @@ -118,4 +118,7 @@ (if ':key '.foo 'a)) (defn fql () - '(1 2 3 (4 5)))
\ No newline at end of file + '(1 2 3 (4 5))) + +(defn fcast () + (if (int 7) (char 17) (long 29999)))
\ No newline at end of file |