Boost logo

Boost :

From: Reece Dunn (msclrhd_at_[hidden])
Date: 2005-10-02 16:53:47


Jonathan Wakely wrote:
> I'm very interested in this library and have some thoughts on Larry's
> reply.
>
> A benefit of Domain-Specific Languages is that you can provide a more
> natural and expressive syntax for the domain. Since most people's
> experience of relational models involves SQL I think a syntax that
> (even vaguely) resembles SQL is better than what is pretty exclusively
> C++ syntax. Try getting a developer who prefers java to write all those
> angle brackets and double colons when they could just connect to an
> RDBMS with JDBC and run SQL queries at runtime (several orders of
> magnitude slower, of course :)

I am not sure how something like this would be structured, but what
about something like Boost.Spirit/Phoenix/Lambda/Xpressive for SQL?

> Also, many queries have a large number of conditions, so the C++ syntax
> will get very long and so is *much* harder to read (and write!)
>
> As for avoiding macros, IMHO using macros is fine in this context.
> Macros are code-generators, and that's exactly what Calum's using them
> for. Again, there's no reason a declaration of a table in the DSL has
> to look like a C++ declaration.

Macros are useful tools - you only have to look at Boost.PreProcessor to
see how powerful it can be! However, macros/preprocessor sould be,
wherever possible, restricted to implementation (like Boost.Function).

As I mentioned above, having a Boost.Spirit-style SQL syntax would
complement the direction that C++/Boost is going with respect to
describing external constructs (RegExes, BNFL grammars) within C++.

The RML database and results could be kept in tuples, so CREATE TABLE
would be:

    typedef boost::tuple< std::string, std::string, int >
            people_table;
    static const int first_name = 0;
    ...

I only have limited knowledge of SQL syntax, but we could then have
something like:

    rml::sql_statement results =
       select_( item_<first_name> && item_<last_name> )
       .where_
       [
          item_<age> >= 30
       ]

    BOOST_FOREACH( data = results( rml_database ))
    {
       std::cout << get<first_name>( data ) << std::endl;
    }

- Reece


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk