From 06d5b26b6b5afd4757a01c995a36037b1cab088b Mon Sep 17 00:00:00 2001 From: Clinton Ebadi Date: Thu, 8 Oct 2009 15:11:17 -0400 Subject: [PATCH] Lexical renaming rework (part one and a half) * Properly expand `let' inside of an expression * Do not introduce new `js:block' when compiling statements --- src/printer.lisp | 5 +++-- src/special-forms.lisp | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/printer.lisp b/src/printer.lisp index 66c07ff..b45f1c6 100644 --- a/src/printer.lisp +++ b/src/printer.lisp @@ -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)))) diff --git a/src/special-forms.lisp b/src/special-forms.lisp index d7eeac5..b495fe9 100644 --- a/src/special-forms.lisp +++ b/src/special-forms.lisp @@ -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 -- 2.20.1