Other advantages of a DSL include type safety and typo safety. :)

-------------------------------------
Marius<marius.dan...@gmail.com> wrote:

That is certainly one way to go but personally I'm not at all a fan of
this string literals approach,. For instance if Scala would not have
had built in XML support using XML as string literals Lift would
probably loose some of its attractions... but that's my opinion.
Furthermore a DSL like language allows better compositionality than
concatenating strings when we want to iteratively add JS code ... for
instance calling the same function multiple times with different
arguments, or collecting code fragments generated by different
application components etc.

Also it seems to me that your approach (somehow similar with
Velocity's) is more expensive but I admit that this is not at all a
strong argument because we're talking about small javascript fragments
so the delta is negligible.

Br's,
Marius

On Dec 12, 8:42 pm, Alex Boisvert <alex.boisv...@gmail.com> wrote:
> 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.


--

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.


Reply via email to