![](https://secure.gravatar.com/avatar/f280fbf7764035c257f907cf2223eac0.jpg?s=120&d=mm&r=g)
WITH-SLOTS had a problem with multiple evaluation: (ps (with-slots (a b) (foo) (+ a b))) => "foo().a + foo().b;" I pushed a fix for that. Patch below. Daniel commit 305778c609dd6102b4a313ef436985551c29ee18 Author: Daniel Gackle <danielgackle@gmail.com> Date: Fri Mar 1 17:17:04 2013 -0700 Fixed bug: multiple evaluation in WITH-SLOTS. diff --git a/src/macros.lisp b/src/macros.lisp index 5537872..b75f4b0 100644 --- a/src/macros.lisp +++ b/src/macros.lisp @@ -140,10 +140,11 @@ (if (listp slot) (second slot) slot))) - `(symbol-macrolet ,(mapcar (lambda (slot) - `(,(slot-var slot) (getprop ,object ',(slot-symbol slot)))) - slots) - ,@body))) + (maybe-once-only (object) + `(symbol-macrolet ,(mapcar (lambda (slot) + `(,(slot-var slot) (getprop ,object ',(slot-symbol slot)))) + slots) + ,@body)))) ;;; multiple values diff --git a/t/output-tests.lisp b/t/output-tests.lisp index 361cd8b..f2d856c 100644 --- a/t/output-tests.lisp +++ b/t/output-tests.lisp @@ -141,6 +141,13 @@ (+ a b c)) "this.a + this.b + this.c;") +(test-ps-js with-slots-single-eval + (lambda () (with-slots (a b) (foo) (+ a b))) + "(function () { + var object1 = foo(); + return object1.a + object1.b; +});") + (test-ps-js object-literal-quoted-symbols (create 'test "bang" 'symbol-saved-my-life "parenscript") "({ 'test' : 'bang', 'symbolSavedMyLife' : 'parenscript' });")