Lexical renaming rework (part one and a half)
authorClinton Ebadi <clinton@unknownlamer.org>
Thu, 8 Oct 2009 19:11:17 +0000 (15:11 -0400)
committerClinton Ebadi <clinton@unknownlamer.org>
Thu, 8 Oct 2009 19:11:17 +0000 (15:11 -0400)
* Properly expand `let' inside of an expression
* Do not introduce new `js:block' when compiling statements

src/printer.lisp
src/special-forms.lisp

index 66c07ff..b45f1c6 100644 (file)
@@ -131,14 +131,15 @@ arguments, defines a printer for that form using the given body."
   (or (cdr (assoc name *lexical-bindings*))
       name))
 
-(defprinter js:let (variables expression)
+(defprinter js:let (variables &body body)
   (let ((*lexical-bindings*
         (append (mapcar (lambda (var)
                           (cons var (if (assoc var *lexical-bindings*)
                                         (ps-gensym var)
                                         var)))
                         variables))))
-    (ps-print expression)))
+    (loop for (exp . remaining) on body do
+        (ps-print exp) (when remaining (psw ";") (newline-and-indent)))))
 
 (defprinter js:variable (var)
   (psw (symbol-to-js-string (rename-js-variable var))))
index d7eeac5..b495fe9 100644 (file)
@@ -591,12 +591,18 @@ lambda-list::=
   `(var ,name ,@(when value-provided? (list value))))
 
 (define-ps-special-form let (bindings &body body)
-  `(js:let ,(mapcar #'car bindings) 
-     ,(ps-compile `(progn
-                    ,@(mapcar (lambda (bind)
-                                `(var ,(car bind) ,(cadr bind)))
-                              bindings)
-                    ,@body))))
+  `(js:let ,(mapcar #'car bindings)
+     ,@(let ((body-forms (if compile-expression?
+                           `((progn
+                                ,@(mapcar (lambda (bind)
+                                            `(var ,(car bind) ,(cadr bind)))
+                                          bindings)
+                                ,@body))
+                           `(,@(mapcar (lambda (bind)
+                                            `(var ,(car bind) ,(cadr bind)))
+                                          bindings)
+                               ,@body))))
+           (mapcar #'ps-compile body-forms))))
 
 (defpsmacro let* (bindings &body body)
   (if bindings