Personally, I would rather go with a JavaScript literal and a simple templating mechanism for substitution/binding of Javascript literals + Json objects that would drive dynamic code (if conditionals, for-loops, ...).
Taking your example, def myFunc = {""" function myFunc( param1, param2 ) { if (param1 < ${limit}) { var home = ( ${max} - 3 ) / 2; var someArray = ${array}; myFunc(1, 2, "do it", home); $("#myID").attr("value", "123"); } for (var i in ${someArray}) { console.log("Hi there " + i); } function ( arg1, arg2 ) { alert("Anonymous function " + arg1 + arg2) }(1, 2); }""".jsBind( "max" -> max, "array" -> array, "someArray" -> someArray, ... ) Not a fully fleshed out example but you get the idea. You'd still be able to bind existing JsExp/JsCmds so some parts could still be abstracted and typed checked. I would find this more readable and simpler that learning a quirky DSL syntax. And I could still copy/paste Javascript code to/from the browser and test it easily. alex On Sat, Dec 12, 2009 at 2:07 AM, Marius Danciu <marius.dan...@gmail.com>wrote: > All, > > I just want to see if there is any interest in the approach discussed here. > As you know Lift has some interesting support for building JavaScript > constructs from Scala code usig JsExp, JsCmd etc classes. I used quite a lot > this support and it's great but if your JS code that you want to send down > to the browser (say as an Ajax or Comet partial update response) gets a bit > more complicated then constructing the JS fragment leads IMO to some > cumbersome Scala code. I found myselft in quite a few situation to use JsRaw > to write the JavaScript fragment in order for the code reader to understand > what JavaScript code will be generated. But of course with JsRaw we put > everything into a String so I'm not a big fan of this approach. So I started > to define a JavaScript like "DSL" that IMO is closer to JavaScript form. > Attached is a source code smaple of how this looks like, so for instance we > can have something like: > > > val js = JsFunc('myFunc, 'param1, 'param2) { > JsIf('param1 __< 30) { > Var('home) := Wrap(234 __- 3) __/ 2 `;` > Var('someArray) := JsArray(1, 2, 3, 4, 5) `;` > 'myFunc(1, 2, "do it", 'home) `;` > $("#myID") >> 'attr("value", "123") `;` > } ~ > JsForEach(Var('i) in 'someArray) { > 'console >> 'log("Hi there " __+ 'i) `;` > } ~ > JsAnonFunc('arg1, 'arg2) { > 'alert("Anonymous function " __+ 'arg1 __+ 'arg2) > }(1, 2) `;` > } > > println(js.toJs) > > this yields the following JavaScript code: > > > function myFunc( param1, param2 ) { > if (param1 < 30) { > var home = ( 234 - 3 ) / 2; > var someArray = [ 1, 2, 3, 4, 5 ]; > myFunc(1, 2, "do it", home); > $("#myID").attr("value", "123"); > } > for (var i in someArray) { > console.log("Hi there " + i); > } > function ( arg1, arg2 ) { > alert("Anonymous function " + arg1 + arg2) > }(1, 2); > } > > > ... ok I just droped nonsense code in there for exemplification. A few > words: > > 1. JsIf, JsForEach describe JavaScript if and for(each) statements > 2. Functions like __<, __>, ... __+, __- are function that alows definition > of boolean and/or algebraic expressions. > 3. Wrap just wraps an expression into () > 4. Var defined a variable > 5 := defines an assignment > 6. JsFunc declares a JS function > 7. JsAnonFunc declares an anonymous function > 8. 'myFunc(1, 2, "do it", 'home) is simply a javascript function > invocation by providing 4 parameter. > 9. ~ is just a function that chains statements that don;t necessarily end > in ; > > > Do you think that something like this would be usable in Lift? > > Br's, > Marius > > -- > You received this message because you are subscribed to the Google Groups > "Lift" group. > To post to this group, send email to lift...@googlegroups.com. > To unsubscribe from this group, send email to > liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/liftweb?hl=en. > -- You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.