Short list with things to finish for D2
yigal chripun
yigal100 at gmail.com
Mon Nov 23 03:51:08 PST 2009
Don Wrote:
> Chad J wrote:
> > Don wrote:
> >> I quite agree. What we can do already is:
> >>
> >> auto statement = db.execute!(`select $a from table where $b > 100 && $c
> >> Like "A*"`)(visitcars.name,visitcars.id, visitcars.surname);
> >>
> >> which I personally like much better than the proposed goal:
> >>
> >>>> It would be so much better to write:
> >>>> auto statement = Select(visitcars.name).Where((visitcards.id `>` 100)
> >>>> `AND` (visitcards.surname `Like` "A*"));
> >> (Replace $a with your preferred method for defining placeholder variables).
> >>
> >> And the question then is, can we improve the existing solution? And if
> >> so, how? I just don't think the solution involves overloading operators.
> >> I think this a great example of why we *don't* want arbitrary operator
> >> overloading: there's no point overloading && and > if you can't make
> >> 'from', 'where', and 'like' to all be infix operators, as well!
> >
> > This sounds like a job for better mixin syntax.
> >
> > So let "template#(args)" be equivalent to "mixin(template!(args))".
> >
> > Then you can do
> >
> > auto statement = db.execute#(`select $visitcars.name from table where
> > $visitcars.id > 100 && $visitcars.surname Like "A*"`);
>
> Yeah, something like that. Or it could mixin automatically. eg if
> macro foo(args...)
> foo(args) meant mixin(foo(args)).
>
> then the syntax would be:
> db.execute(`select $visitcars.name from table where $visitcars.id > 100
> && $visitcars.surname Like "A*"`);
>
> which has advantages and disadvantages. So there's quite a bit of
> flexibility. A lot of potential for brainstorming!
a few points I want to add:
1) I though that :name was in some version of the SQL standard or a know extension so if we use this in APIs for D we should use the standard notation (can anyone verify this?)
2) I don't want to mix this discussion with infix functions and operator overloading. I'm not sure I want to limit these and perhaps there are other legitimate uses for general purpose infix functions. In this post I just pointed out that SQL is *not* a legitimate use case for that.
3) the Nemerle macros for SQL allow for:
db.execute(`select $visitcars.name from table where $visitcars.id > 100 && $visitcars.surname Like "A*"`);
the $ in Nemerle is used for controled breaking of hygene. Their Macro translates such a query into a sql string with :names and calls for the bind API to connect those with the given variables in a type-safe way.
IIRC, they use the db connection object to conncet to the DB at compile-time and check the syntax and also existence of the objects (tables, columns, etc) in the DB schema.
More information about the Digitalmars-d
mailing list