(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*)))
(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)
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))
(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))
(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)
(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)
(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))))
(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 ", ")))
(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 ")
(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