[Lift] Re: rlambda lift project updated

2009-05-16 Thread Meredith Gregory
Tim,

Thanks for your generous offer. Code review would be great. My next steps
include

   - Wiring up BDBXML for a persistence layer
   - Wiring up ANTLR as the fallback parser generator

If you, or anyone, wants to take a swipe at a relational persistence as
well, that would be fantastic. The idea is to simply generate the subclasses
of the classes in Absyn that would provide the mapping to store. Since i've
got a functioning Java parser, i was going to attack the problem at that
level. This allows me to generate Scala classes with very little pain. It's
also possible to take the following approaches.

   - Hack the backend of BNFC
   - Use the visitor pattern stuff generated by BNFC

Of course, code review would be great. Also, i just got a note from someone
that the jlex/cup dependencies are being properly handled by maven. If you
could verify, that would be awesome.

Best wishes,

--greg

On Fri, May 15, 2009 at 4:40 AM, Timothy Perrett timo...@getintheloop.euwrote:


 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 lgreg.mered...@gmail.com wrote:
  Lifted,
 
  i've added support to the rlambda lift
  projecthttp://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 liftweb@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
-~--~~~~--~~--~--~---



[Lift] Re: rlambda lift project updated

2009-05-15 Thread Timothy Perrett

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 lgreg.mered...@gmail.com wrote:
 Lifted,

 i've added support to the rlambda lift
 projecthttp://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
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Lift group.
To post to this group, send email to liftweb@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
-~--~~~~--~~--~--~---



[Lift] Re: rlambda lift project updated

2009-05-15 Thread David Bernard
On Thu, May 14, 2009 at 21:41, Meredith Gregory lgreg.mered...@gmail.comwrote:

 Lifted,

 i've added support to the rlambda lift 
 projecthttp://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.

 If I understand your request :

${maven.runtime.classpath}

see
http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html


-
- 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 don't know a simple solution.



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

 


--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Lift group.
To post to this group, send email to liftweb@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
-~--~~~~--~~--~--~---



[Lift] Re: rlambda lift project updated

2009-05-15 Thread Charles F. Munat

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 lgreg.mered...@gmail.com wrote:
 Lifted,

 i've added support to the rlambda lift
 projecthttp://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
  

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Lift group.
To post to this group, send email to liftweb@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
-~--~~~~--~~--~--~---



[Lift] Re: rlambda lift project updated

2009-05-15 Thread Timothy Perrett


Sounds good - we have a DSL that's used at work this could be really great
for.

Cheers, Tim

On 15/05/2009 17:47, Charles F. Munat c...@munat.com 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 lgreg.mered...@gmail.com wrote:
 Lifted,
 
 i've added support to the rlambda lift
 projecthttp://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
 
 
  
 



--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Lift group.
To post to this group, send email to liftweb@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
-~--~~~~--~~--~--~---



[Lift] Re: rlambda lift project updated

2009-05-15 Thread Meredith Gregory
David,

Sweet! Thanks that little maven trick should eliminate one of my problems.

i've been thinking a bit more about the meta-compiler-compiler approach and
-- because i believe it gives me a way to generate Josh Suereth's LOLCode as
a side-effect -- i'm ever so inclined to take it. Who says side-effects are
bad?

Best wishes,

--greg

On Fri, May 15, 2009 at 7:38 AM, David Bernard
david.bernard...@gmail.comwrote:



 On Thu, May 14, 2009 at 21:41, Meredith Gregory 
 lgreg.mered...@gmail.comwrote:

 Lifted,

 i've added support to the rlambda lift 
 projecthttp://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.

 If I understand your request :

 ${maven.runtime.classpath}

 see
 http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html


-
- 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 don't know a simple solution.



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



[Lift] Re: rlambda lift project updated

2009-05-15 Thread Meredith Gregory
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 herehttp://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 c...@munat.com 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 lgreg.mered...@gmail.com wrote:
  Lifted,
 
  i've added support to the rlambda lift
  projecthttp://code.google.com/p/rlambda/taking it within range of
  being a candidate DSL-archetype. At this point it
  is 

[Lift] Re: rlambda lift project updated

2009-05-15 Thread Charles F. Munat

O. 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 c...@munat.com 
 mailto:c...@munat.com 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 

[Lift] Re: rlambda lift project updated

2009-05-15 Thread Meredith Gregory
Chas,

You know, with all his research on 'Manufacturing Consent', Noam might have
a 3rd career in managing open source projects. Since you've pinned the tail
on the donkey, so to speak, do you think there might be a connection between
ideology and design skills? i mean his work on grammars and computability
was really wicked clever. You don't think his pinko commie leanings could
like have any connection to his insights on linguistics and computation, do
you?

Best wishes,

--greg

On Fri, May 15, 2009 at 12:47 PM, Charles F. Munat c...@munat.com wrote:


 O. 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 c...@munat.com
  mailto:c...@munat.com 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