summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-05-08 17:11:58 +0000
committerRich Hickey <richhickey@gmail.com>2006-05-08 17:11:58 +0000
commit5fc1edd4ce80742aadd48949f6b09d3b3b810ccf (patch)
treeae5cd4545f971e8c7f7a469bfb936ba07c9eeef5
parent393b6fcf74aa8e27adce220d15d0b12be1d8ce1c (diff)
added casts
-rw-r--r--src/lisp/clojure.lisp25
-rw-r--r--src/lisp/test.lisp5
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