Fixed some special forms that weren't macro-expanding their arguments.
authorVladimir Sedach <vsedach@gmail.com>
Fri, 15 May 2009 22:04:33 +0000 (16:04 -0600)
committerVladimir Sedach <vsedach@gmail.com>
Fri, 15 May 2009 22:04:33 +0000 (16:04 -0600)
src/special-forms.lisp
t/ps-tests.lisp

index 6decc8f..a7c7d28 100644 (file)
@@ -64,7 +64,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; arrays
 (define-ps-special-form array (&rest values)
-  `(js:array ,@(mapcar (lambda (form) (compile-parenscript-form form :expecting :expression))
+  `(js:array ,@(mapcar (lambda (form) (compile-parenscript-form (ps-macroexpand form) :expecting :expression))
                                values)))
 
 (define-ps-special-form aref (array &rest coords)
 
 (define-ps-special-form if (test then &optional else)
   (ecase expecting
-    (:statement `(js:if ,(compile-parenscript-form test :expecting :expression)
+    (:statement `(js:if ,(compile-parenscript-form (ps-macroexpand test) :expecting :expression)
                         ,(compile-parenscript-form `(progn ,then))
                         ,@(when else `(:else ,(compile-parenscript-form `(progn ,else))))))
-    (:expression `(js:? ,(compile-parenscript-form test :expecting :expression)
-                        ,(compile-parenscript-form then :expecting :expression)
-                        ,(compile-parenscript-form else :expecting :expression)))))
+    (:expression `(js:? ,(compile-parenscript-form (ps-macroexpand test) :expecting :expression)
+                        ,(compile-parenscript-form (ps-macroexpand then) :expecting :expression)
+                        ,(compile-parenscript-form (ps-macroexpand else) :expecting :expression)))))
 
 (define-ps-special-form switch (test-expr &rest clauses)
   `(js:switch ,(compile-parenscript-form test-expr :expecting :expression)
@@ -469,7 +469,7 @@ lambda-list::=
 
 (define-ps-special-form create (&rest arrows)
   `(js:object ,@(loop for (key-expr val-expr) on arrows by #'cddr collecting
-                     (let ((key (compile-parenscript-form key-expr :expecting :expression)))
+                     (let ((key (compile-parenscript-form (ps-macroexpand key-expr) :expecting :expression)))
                        (when (keywordp key)
                          (setf key `(js:variable ,key)))
                        (assert (or (stringp key)
@@ -479,7 +479,7 @@ lambda-list::=
                                             (eq 'quote (car key)))))
                                ()
                                "Slot key ~s is not one of js-variable, keyword, string or number." key)
-                       (cons key (compile-parenscript-form val-expr :expecting :expression))))))
+                       (cons key (compile-parenscript-form (ps-macroexpand val-expr) :expecting :expression))))))
 
 (define-ps-special-form %js-slot-value (obj slot)
   (let ((slot (ps-macroexpand slot)))
index d375ddc..bc60917 100644 (file)
@@ -1041,3 +1041,27 @@ x + x;")
     var x1 = 1 + x;
     return x1;
 };")
+
+(test-ps-js symbol-macro-array
+  (symbol-macrolet ((x 1))
+    (list x))
+  "[1];")
+
+(test-ps-js symbol-macro-obj
+  (symbol-macrolet ((x y))
+    (create x 1))
+  "{ y : 1 };")
+
+(test-ps-js symbol-macro-conditional1
+  (symbol-macrolet ((x y))
+    (if x x x))
+  "if (y) {
+    y;
+} else {
+    y;
+};")
+
+(test-ps-js symbol-macro-conditional2
+  (symbol-macrolet ((x y))
+    (return (if x x x)))
+  "return y ? y : y;")