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 <[email protected]>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 [email protected].
> To unsubscribe from this group, send email to
> [email protected]<liftweb%[email protected]>
> .
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en.