For everyone's reference, here's the definition of @:
(defpsmacro @ (obj &rest props) (if (null props) obj `(@ (slot-value ,(if (stringp obj) `($ ,obj) obj) ,(let ((prop (macroexpand (first props)))) (if (symbolp prop) `',prop prop))) ,@(cdr props))))
It's a macro whose idea Daniel borrowed from Peter Seibel's Lispscript Lisp-to-JavaScript compiler, and does things like (ps (@ foo "bar" 3 baz)) => foo['bar'][3].baz;. I will probably include it in the ParenScript helper library someday when I am unlazy enough to write the documentation.
That being said, the behavior demonstrated is a feature, not a bug. The macros are being expanded in the right order (that is, same order as Common Lisp does it). Consider the following Common Lisp code:
(defmacro foo (x) (format nil "~a" x))
(foo bar) => "BAR"
(symbol-macrolet ((bar 1)) (list (foo bar) bar)) => ("BAR" 1)
Vladimir
On 9/12/07, Daniel Gackle danielgackle@gmail.com wrote:
This works correctly:
(ps (symbol-macrolet ((blah "y")) (setf (aref x blah) 123)))
=> "x['y'] = 123;"
... while it appears this does not:
(ps (symbol-macrolet ((blah "y")) (setf (@ x blah) 123)))
=> "x.blah = 123;"
Daniel
parenscript-devel mailing list parenscript-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/parenscript-devel