Simplify literal object dumping
authorDavid Vázquez <davazp@gmail.com>
Fri, 26 Apr 2013 17:49:09 +0000 (18:49 +0100)
committerDavid Vázquez <davazp@gmail.com>
Fri, 26 Apr 2013 17:49:09 +0000 (18:49 +0100)
jscl.lisp
src/boot.lisp
src/compiler.lisp
src/toplevel.lisp

index 3a70e2e..51a6ba6 100644 (file)
--- a/jscl.lisp
+++ b/jscl.lisp
@@ -64,7 +64,7 @@
 
 (defun bootstrap ()
   (setq *environment* (make-lexenv))
-  (setq *literal-symbols* nil)
+  (setq *literal-table* nil)
   (setq *variable-counter* 0
         *gensym-counter* 0
         *literal-counter* 0
index de32e75..2149308 100644 (file)
                          `((,(ecase (car c)
                                     (integer 'integerp)
                                     (cons 'consp)
+                                    (symbol 'symbolp)
                                     (string 'stringp)
+                                    (array 'arrayp)
                                     (atom 'atom)
                                     (null 'null))
                              ,value)
index 6b334df..36510f9 100644 (file)
     output))
 
 
-(defvar *literal-symbols* nil)
+(defvar *literal-table* nil)
 (defvar *literal-counter* 0)
 
 (defun genlit ()
     ((integerp sexp) (integer-to-string sexp))
     ((floatp sexp) (float-to-string sexp))
     ((stringp sexp) (code "\"" (escape-string sexp) "\""))
-    ((symbolp sexp)
-     (or (cdr (assoc sexp *literal-symbols*))
-        (let ((v (genlit))
-              (s (dump-symbol sexp)))
-          (push (cons sexp v) *literal-symbols*)
-          (toplevel-compilation (code "var " v " = " s))
-          v)))
-    ((consp sexp)
-     (let ((c (dump-cons sexp)))
-       (if recursive
-          c
-          (let ((v (genlit)))
-             (toplevel-compilation (code "var " v " = " c))
-             v))))
-    ((arrayp sexp)
-     (let ((c (dump-array sexp)))
-       (if recursive
-           c
-           (let ((v (genlit)))
-             (toplevel-compilation (code "var " v " = " c))
-             v))))))
+    (t
+     (or (cdr (assoc sexp *literal-table*))
+        (let ((dumped (typecase sexp
+                         (symbol (dump-symbol sexp))
+                         (cons (dump-cons sexp))
+                         (array (dump-array sexp)))))
+           (if recursive
+               dumped
+               (let ((jsvar (genlit)))
+                 (push (cons sexp jsvar) *literal-table*)
+                 (toplevel-compilation (code "var " jsvar " = " dumped))
+                 jsvar)))))))
 
 (define-compilation quote (sexp)
   (literal sexp))
index 0a1b4dd..e5f73f9 100644 (file)
@@ -97,8 +97,8 @@
    (ls-compile
     `(progn
        ,@(mapcar (lambda (s) `(%intern-symbol (%js-vref ,(cdr s))))
-                 *literal-symbols*)
-       (setq *literal-symbols* ',*literal-symbols*)
+                 *literal-table*)
+       (setq *literal-table* ',*literal-table*)
        (setq *variable-counter* ,*variable-counter*)
        (setq *gensym-counter* ,*gensym-counter*)
        (setq *block-counter* ,*block-counter*)))))