Ooooo. You've polished this up a bit. Very nice.

Chomsky? Isn't he that commie pinko America-hater?

Chas.

Meredith Gregory wrote:
> Chas,
> 
> You're too kind. Fortunately, i can take none of the credit: 
> language-based design goes all the way back to Chomsky. ;-) For those 
> who are not familiar with this approach, a little cheat sheet goes a 
> long way.
> 
> Classes ~ Types = Grammatical Categories
> 
> In English, the category associated with a symbol in a grammar is 
> essentially a type in a functional language, and for a good chunk of 
> OO-style classes, such a category also corresponds to a class. The main 
> trick is to recognize that this is not just for parsing, anymore. The 
> abstract syntax tree associated with such a grammar is essentially a 
> family of classes/types that addresses some domain model. This is really 
> solid for FP types, and for the POJO-style classes (which are 
> essentially relations).
> 
>  To illustrate, suppose we wanted to model some basic idea of reporting. 
> That is, we had
> 
>     * a basic report structure -- that was a list of queries and their
>       responses
>     * an aggregate report structure -- that was merely a roll up of a
>       bunch of sub-reports
>     * a dependent report structure -- in which a report was a function
>       of some other reports 
>     * an "application" report structure -- in which we apply dependent
>       reports to argument reports
> 
> One way to go about modeling this is as a little language of reports.
> 
> Report ::= BasicReport | AggregateReport | DependentReport | 
> ApplicationReport
> BasicReport ::= ReportID { (Query,Response)* }
> AggregateReport ::= [ Report* ]
> DependentReport ::= ( Formal* ){ Report }
> ApplicationReport ::= Report Report*
> Formal ::= Variable
> Query ::= ...
> Response ::= ...
> 
> This is enough information to generate the entire class structure, with 
> persistence, plus a concrete language (with parser) that can be used for 
> testing (or other nefarious) purposes. To see an example of this -- the 
> little demo i gave Chas -- look here 
> <http://code.google.com/p/reportatrope/>. Note that this specifies only 
> the /structural/ aspects of the relationships governing our model of 
> reports. It doesn't give any sense of
> 
>     * how to render reports, or even
>     * how to calculate the application of a dependent report to some
>       arguments
> 
> To this last point, those with a little more experience will spot that 
> this structure is remarkably similar to... (wait for it) the lambda 
> calculus. Yes, i've snuck in a little programming language structure to 
> my model because ... well... it turns out it's really necessary for most 
> moderately rich domains. This comes with a notion of evaluation that 
> can, in principle, provide a reasonable semantics for how one calculates 
> application reports. That gives some insight into why choose rlambda as 
> the archetype. It also indicates that adding some sort of rewrite rules 
> to the grammar above might be a good thing. In this case, the rewrite 
> rule is something like
> 
> ( f1, ..., fn ){ R } R1 ... Rn -> R{ R1/f1, ..., Rn/fn }
> 
> In English, a dependent report with formal parameters f1, ..., fn, 
> applied to arguments R1, ..., Rn evaluates to the body of the dependent 
> report with the parameters replaced by the arguments. This indicates we 
> have to add one production to the grammar above
> 
> VariableReport ::= Variable
> 
> so that variables can actually occur in the body of reports!
> 
> There are a lot of technical details i'm eliding here. Further, it's not 
> like one is going to be able to autogenerate a production quality 
> language like Scala from a specification of this kind (yet!). But, it is 
> a lot better than beginning with a blank slate.
> 
> To the first bullet above, it turns out that there are some natural 
> default rendering's of structure so defined that -- in my view -- line 
> up very well with Charles' vision of the web app pipeline.
> 
> Best wishes,
> 
> --greg
> 
> On Fri, May 15, 2009 at 9:47 AM, Charles F. Munat <[email protected] 
> <mailto:[email protected]>> wrote:
> 
> 
>     I've seen this demonstrated and the conceptual part is actually
>     drop-dead simple. But maybe watching it work helps a lot.
> 
>     I might also add that watching Greg write some straightforward BNF to
>     describe a complex relationship between objects in a simple DSL and then
>     generate a Lift app from in -- all in about half an hour -- was so
>     astonishing that I haven't been able to stop thinking about it and can
>     barely wait to run into him again to ask questions about it.
> 
>     I'm not very bright, so Greg can correct me if I'm wrong here, but
>     essentially you just write up your DSL in BNF, then you run the BNF
>     compiler and out pops some Java classes (which you dump in your model
>     directory). Then you extend those classes using Scala and you're
>     good to go.
> 
>     Chas.
> 
>     Timothy Perrett wrote:
>      > Greg, I find this very interesting.
>      >
>      > How can I help you out here? I can certainly review your lift code,
>      > not so sure about some of the crazy conceptual stuff though!
>      >
>      > Cheers, Tim
>      >
>      > On May 14, 8:41 pm, Meredith Gregory <[email protected]
>     <mailto:[email protected]>> wrote:
>      >> Lifted,
>      >>
>      >> i've added support to the rlambda lift
>      >> project<http://code.google.com/p/rlambda/>taking it within range of
>      >> being a candidate DSL-archetype. At this point it
>      >> is possible simply to supply a .cf file in the src/main/bnfc
>     directory and
>      >> it will generate everything from that. i've still got to
>     conditionally
>      >> include the Eval and Compile functionality for DSL that
>     have/don't have this
>      >> capability.
>      >>
>      >> i've two remaining questions for this leg of the work.
>      >>
>      >>    - Does anyone know how to reference maven dependencies within
>     some flavor
>      >>    of maven-antrun-plugin? The original version does not appear
>     to have this
>      >>    functionality and Sun's maven-antrun-extended-plugin (which
>     is supposed to
>      >>    supply this functionality) has so little documentation (that
>     i could find)
>      >>    that i couldn't get it to work after an hour our so.
>      >>    - This version requires that BNFC, as an executable, be
>     available on the
>      >>    path. Is there a blessed way to handle this sort of dependency?
>      >>       - i've got a hare-brained scheme that will fix this -- a
>      >>       meta-compiler-compiler from BNFC's input format to ANTLR's. i
>      >> could include
>      >>       such a transform as a part of the project or a dependency and
>      >> test for the
>      >>       availability of BNFC and fall back to ANTLR if it's not
>     available.
>      >>
>      >> If anybody wanted to give this round of updates a whirl, even
>     give me a code
>      >> review, i would be very grateful.
>      >>
>      >> Best wishes,
>      >>
>      >> --greg
>      >>
>      >> --
>      >> L.G. Meredith
>      >> Managing Partner
>      >> Biosimilarity LLC
>      >> 1219 NW 83rd St
>      >> Seattle, WA 98117
>      >>
>      >> +1 206.650.3740
>      >>
>      >> http://biosimilarity.blogspot.com
>      > >
> 
> 
> 
> 
> 
> -- 
> L.G. Meredith
> Managing Partner
> Biosimilarity LLC
> 1219 NW 83rd St
> Seattle, WA 98117
> 
> +1 206.650.3740
> 
> http://biosimilarity.blogspot.com
> 
> > 

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to