On Sat, 2 Sep 2006, John Resig wrote: >> Lately I've been experimenting with Parenscript, which is a >> Lisp-to-JavaScript translator that allows you to write macros; if >> anyone's interested I can post some sequencing macro code I've been >> working on... > > Go ahead! I'm interested :-)
Right on. So, for a simple example, here's a snippet of Parenscript code that creates a DIV, puts some text in it, and fades it in, out, and back in again: (.append #$"body" (html ((:div :id "mydiv" :style (css-inline :background "white")) "Hello, world!"))) (seq (.fade-in #$"div #mydiv" "slow") (.fade-out #$"div #mydiv" "slow") (.fade-in #$"div #mydiv" "fast"))) A few notes about the syntax: The "#$" is a reader-macro I wrote for for convenience; #$"body" gets transformed into ($ "body"). I haven't yet decided if this is a good thing or not. ;) In Parenscript, functions that start with a "." such as ".append" and ".fade-in", above, are treated as method calls. Capitalization is translated by Parenscript from Lisp-style to JavaScript-style, which is why the jQuery methods end up looking like ".fade-in". The "html" and "css-inline" macros are part of Parenscript, and allow you to generate JavaScript that builds HTML and CSS from s-expressions. The sequencing macro is "seq". The above "seq" call gets transformed into the following: (.fade-in #$"div #mydiv" "slow" (lambda () (.fade-out #$"div #mydiv" "slow" (lambda () (.fade-in #$"div #mydiv" "fast"))))) The resulting JavaScript is this: function main() { $('body').append('<div id="mydiv" style="' + ('background:white') + '">Hello, world!</div>'); $('div #mydiv').fadeIn('slow', function () { $('div #mydiv').fadeOut('slow', function () { $('div #mydiv').fadeIn('fast'); }); }); } So, this has similar effects to what I think you're trying to achieve with method chaining, but is more general because you are not limited to a single jQuery object for the dispatch of each chained operation. Here's my working definition of "seq": (defjsmacro seq (&rest forms) (labels ((aux (lst) (cond ((null lst) nil) ((and (consp lst) (not (cdr lst))) (car lst)) (t (append (car lst) (list `(lambda () ,(aux (cdr lst))))))))) (aux forms))) I'd like to extend it to allow inserting ordinary code in the middle of the sequence with a "par" construct - I'm lifting this terminology out of an interesting but obscure concurrent language called Occam: http://en.wikipedia.org/wiki/Occam_programming_language Ironically, in an event-driven model, "par" is really the default behavior. When working with background functions, everything is parallel; you have to really work at making things sequential. Dave _______________________________________________ jQuery mailing list discuss@jquery.com http://jquery.com/discuss/