Operator overloading or alternatives to expression templates

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Sat Sep 12 20:03:44 PDT 2015


On 09/12/2015 04:08 PM, Martin Nowak wrote:
> On Friday, 11 September 2015 at 23:47:42 UTC, Andrei Alexandrescu wrote:
>> 1. Use lambdas, which seem to already do what you want:
>>
>> db.get!Person.filter!(p => p.age > 21 && p.name == "Peter")
>>
>> The way this'd go, the db.get!Person() call returns an input range of
>> Person. Presumably introspection is being used to bind fields in the
>> query such as "age" and "name" to static field names in struct Person.
>> Then good old std.algorithm.filter takes care of the rest.
>
> I'm instantiating the lambda with a fake p to capture the expression so
> I can translate it to whatever SQL, MongoDB, columnar db is used.

Yah, understood. Problem here is the approach is bound to run into walls 
at every few steps. Say you fix the comparisons to work. Then you have 
operators such as LIKE that are necessary yet not representable in D. So 
more tricks are in order. This is what I've seen with ET in C++ - an 
endless collection of tricks to achieve modest outcomes at enormous costs.

>> 2. If you want to embed real SQL into D, use string-based DSLs.
>
> Strings don't capture context, aren't typechecked, and require a complex
> CTFE parser.
>
> db.get!Person.where!"age > 21 & name = ?"(name);

Understood as well. I figure from the example you have binding in mind, 
which is good. At some point you need to bite the bullet and write a 
parser for the relational query language you want there.


Andrei



More information about the Digitalmars-d mailing list