Fixed several special forms that were not macroexpanding their
authorVladimir Sedach <vsedach@gmail.com>
Mon, 8 Jun 2009 05:27:47 +0000 (23:27 -0600)
committerVladimir Sedach <vsedach@gmail.com>
Mon, 8 Jun 2009 05:27:47 +0000 (23:27 -0600)
arguments.

Bug reports thanks to Scott
Bell. http://common-lisp.net/pipermail/parenscript-devel/2009-June/000530.html

src/special-forms.lisp
t/ps-tests.lisp

index 9a324e2..802dc28 100644 (file)
                       ,(compile-parenscript-form delta :expecting :expression)))))
 
 (define-ps-special-form decf (x &optional (delta 1))
-  (if (eql delta 1)
-      `(js:unary-operator js:-- ,(compile-parenscript-form x :expecting :expression) :prefix t)
-      `(js:operator js:-= ,(compile-parenscript-form x :expecting :expression)
-                    ,(compile-parenscript-form delta :expecting :expression))))
+  (let ((x (ps-macroexpand x))
+        (delta (ps-macroexpand delta)))
+    (if (eql delta 1)
+        `(js:unary-operator js:-- ,(compile-parenscript-form x :expecting :expression) :prefix t)
+        `(js:operator js:-= ,(compile-parenscript-form x :expecting :expression)
+                      ,(compile-parenscript-form delta :expecting :expression)))))
 
 (define-ps-special-form - (first &rest rest)
-  (if rest
-      `(js:operator js:- ,@(mapcar (lambda (val) (compile-parenscript-form val :expecting :expression))
-                                   (cons first rest)))
-      `(js:unary-operator js:- ,(compile-parenscript-form first :expecting :expression) :prefix t)))
+  (let ((first (ps-macroexpand first))
+        (rest (mapcar #'ps-macroexpand rest)))
+    (if rest
+        `(js:operator js:- ,@(mapcar (lambda (val) (compile-parenscript-form val :expecting :expression))
+                                     (cons first rest)))
+        `(js:unary-operator js:- ,(compile-parenscript-form first :expecting :expression) :prefix t))))
 
 (define-ps-special-form not (x)
   (let ((form (compile-parenscript-form (ps-macroexpand x) :expecting :expression))
@@ -586,7 +590,11 @@ lambda-list::=
 
 (define-ps-special-form let (bindings &body body)
   (let* (lexical-bindings-introduced-here
-         (normalized-bindings (mapcar (lambda (x) (if (symbolp x) `(,x nil) x)) bindings))
+         (normalized-bindings (mapcar (lambda (x)
+                                        (if (symbolp x)
+                                            (list x nil)
+                                            (list (car x) (ps-macroexpand (cadr x)))))
+                                      bindings))
          (free-variables-in-binding-value-expressions (mapcan (lambda (x) (flatten (cadr x)))
                                                               normalized-bindings)))
     (flet ((maybe-rename-lexical-var (x)
index 291a95e..cd9d4f2 100644 (file)
@@ -1106,3 +1106,26 @@ var x1 = function (x) {
 };
 x1(x);")
 
+(test-ps-js macrolet-let-inteference
+  (macrolet ((a (n) `(+ ,n 5)))
+    (let ((a (a 1)))
+      (let ((b (a (- a 4))))
+        (+ a b))))
+  "var a = 1 + 5;
+var b = (a - 4) + 5;
+a + b;")
+
+(test-ps-js let-subtract-add
+  (let ((x 1))
+    (let ((x 2))
+      (- x x)
+      (- x)
+      (decf x)
+      (incf x)))
+  "var x = 1;
+var x1 = 2;
+x1 - x1;
+-x1;
+--x1;
+++x1;")
+