Fixed non-uniform handling of quoted symbols that manifested itself in
[clinton/parenscript.git] / src / printer.lisp
index 39dcc09..dbeea7a 100644 (file)
@@ -16,7 +16,7 @@ vice-versa.")
   (let ((*indent-level* 0)
         (*print-accumulator* ()))
     (if (and (listp form) (eq 'js:block (car form))) ; ignore top-level block
-        (loop for (statement . remaining) on (third form) do
+        (loop for (statement . remaining) on (cdr form) do
              (ps-print statement) (psw ";") (when remaining (psw #\Newline)))
         (ps-print form))
     (nreverse *print-accumulator*)))
@@ -136,7 +136,7 @@ arguments, defines a printer for that form using the given body."
         (psw #\[) (ps-print idx) (psw #\])))
 
 (defprinter js:variable (var)
-  (psw (js-translate-symbol var)))
+  (psw (symbol-to-js-string var)))
 
 ;;; arithmetic operators
 (defun parenthesize-print (ps-form)
@@ -168,21 +168,20 @@ arguments, defines a printer for that form using the given body."
            fun-designator)
   (psw #\() (print-comma-delimited-list args) (psw #\)))
 
-(defprinter js:block (block-type statements)
-  (case block-type
-    (:statement
-     (psw #\{)
-     (incf *indent-level*)
-     (dolist (statement statements)
-       (newline-and-indent) (ps-print statement) (psw #\;))
-     (decf *indent-level*)
-     (newline-and-indent)
-     (psw #\}))
-    (:expression
-     (psw #\()
-     (loop for (statement . remaining) on statements do
-           (ps-print statement) (when remaining (psw ", ")))
-     (psw #\)))))
+(defprinter js:|,| (&rest expressions)
+  (psw #\()
+  (loop for (exp . remaining) on expressions do
+       (ps-print exp) (when remaining (psw ", ")))
+  (psw #\)))
+
+(defprinter js:block (&rest statements)
+  (psw #\{)
+  (incf *indent-level*)
+  (dolist (statement statements)
+    (newline-and-indent) (ps-print statement) (psw #\;))
+  (decf *indent-level*)
+  (newline-and-indent)
+  (psw #\}))
 
 (defprinter js:lambda (args body)
   (print-fun-def nil args body))
@@ -191,9 +190,9 @@ arguments, defines a printer for that form using the given body."
   (print-fun-def name args body))
 
 (defun print-fun-def (name args body-block)
-  (psw (format nil "function ~:[~;~A~](" name (js-translate-symbol name)))
+  (psw (format nil "function ~:[~;~A~](" name (symbol-to-js-string name)))
   (loop for (arg . remaining) on args do
-        (psw (js-translate-symbol arg)) (when remaining (psw ", ")))
+        (psw (symbol-to-js-string arg)) (when remaining (psw ", ")))
   (psw ") ")
   (ps-print body-block))
 
@@ -201,7 +200,7 @@ arguments, defines a printer for that form using the given body."
   (psw "{ ")
   (loop for ((slot-name . slot-value) . remaining) on slot-defs do
         (if (and (listp slot-name) (eq 'quote (car slot-name)) (symbolp (second slot-name)))
-            (psw (js-translate-symbol (second slot-name)))
+            (psw (symbol-to-js-string (second slot-name)))
             (ps-print slot-name))
         (psw " : ")
         (ps-print slot-value)
@@ -215,25 +214,20 @@ arguments, defines a printer for that form using the given body."
       (parenthesize-print obj)
       (ps-print obj))
   (if (symbolp slot)
-      (progn (psw #\.) (psw (js-translate-symbol slot)))
+      (progn (psw #\.) (psw (symbol-to-js-string slot)))
       (progn (psw #\[) (ps-print slot) (psw #\]))))
 
-(defprinter js:cond (clauses)
-  (loop for (test body-block) in clauses
-        for start = "if (" then " else if (" do
-        (if (equalp test "true")
-            (psw " else ")
-            (progn (psw start)
-                   (ps-print test)
-                   (psw ") ")))
-        (ps-print body-block)))
-
-(defprinter js:if (test then-block else-block)
+(defprinter js:if (test consequent &rest clauses)
   (psw "if (") (ps-print test) (psw ") ")
-  (ps-print then-block)
-  (when else-block
-      (psw " else ")
-      (ps-print else-block)))
+  (ps-print consequent)
+  (loop while clauses do
+       (ecase (car clauses)
+         (:else-if (psw " else if (") (ps-print (cadr clauses)) (psw ") ")
+                   (ps-print (caddr clauses))
+                   (setf clauses (cdddr clauses)))
+         (:else (psw " else ")
+                (ps-print (cadr clauses))
+                (return)))))
 
 (defprinter js:? (test then else)
   (ps-print test)
@@ -251,7 +245,7 @@ arguments, defines a printer for that form using the given body."
 
 (defprinter js:var (var-name &rest var-value)
   (psw "var ")
-  (psw (js-translate-symbol var-name))
+  (psw (symbol-to-js-string var-name))
   (when var-value
     (psw " = ")
     (ps-print (car var-value))))
@@ -260,21 +254,21 @@ arguments, defines a printer for that form using the given body."
   (psw "break")
   (when label
     (psw " ")
-    (psw (js-translate-symbol label))))
+    (psw (symbol-to-js-string label))))
 
 (defprinter js:continue (&optional label)
   (psw "continue")
   (when label
     (psw " ")
-    (psw (js-translate-symbol label))))
+    (psw (symbol-to-js-string label))))
 
 ;;; iteration
 (defprinter js:for (label vars tests steps body-block)
-  (when label (psw (js-translate-symbol label)) (psw ": ") (newline-and-indent))
+  (when label (psw (symbol-to-js-string label)) (psw ": ") (newline-and-indent))
   (psw "for (")
   (loop for ((var-name . var-init) . remaining) on vars
         for decl = "var " then "" do
-        (psw decl) (psw (js-translate-symbol var-name)) (psw " = ") (ps-print var-init) (when remaining (psw ", ")))
+        (psw decl) (psw (symbol-to-js-string var-name)) (psw " = ") (ps-print var-init) (when remaining (psw ", ")))
   (psw "; ")
   (loop for (test . remaining) on tests do
        (ps-print test) (when remaining (psw ", ")))
@@ -325,7 +319,7 @@ arguments, defines a printer for that form using the given body."
   (psw "try ")
   (ps-print body-block)
   (when catch
-    (psw " catch (") (psw (js-translate-symbol (first catch))) (psw ") ")
+    (psw " catch (") (psw (symbol-to-js-string (first catch))) (psw ") ")
     (ps-print (second catch)))
   (when finally
     (psw " finally ")
@@ -361,6 +355,7 @@ arguments, defines a printer for that form using the given body."
   (psw #\)))
 
 (defprinter js:escape (literal-js)
+  ;; literal-js should be a form that evaluates to a string containing valid JavaScript
   (psw literal-js))
 
 ;;; named statements