From 6dce8f773e92022971ed493610b18e5b6a23ad96 Mon Sep 17 00:00:00 2001 From: Vladimir Sedach Date: Fri, 15 May 2009 16:04:33 -0600 Subject: [PATCH] Fixed some special forms that weren't macro-expanding their arguments. --- src/special-forms.lisp | 14 +++++++------- t/ps-tests.lisp | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/special-forms.lisp b/src/special-forms.lisp index 6decc8f..a7c7d28 100644 --- a/src/special-forms.lisp +++ b/src/special-forms.lisp @@ -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) @@ -167,12 +167,12 @@ (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))) diff --git a/t/ps-tests.lisp b/t/ps-tests.lisp index d375ddc..bc60917 100644 --- a/t/ps-tests.lisp +++ b/t/ps-tests.lisp @@ -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;") -- 2.11.4.GIT