X-Git-Url: https://git.hcoop.net/clinton/parenscript.git/blobdiff_plain/48ea6dd2196d3859b0d4d9d7a92181bb00f3e4bd..dd4442b8973fe8b2c19b44f94f244934aa418ae8:/src/printer.lisp diff --git a/src/printer.lisp b/src/printer.lisp index 39dcc09..dbeea7a 100644 --- a/src/printer.lisp +++ b/src/printer.lisp @@ -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