Operator overloading or alternatives to expression templates

Dmitry Olshansky via Digitalmars-d digitalmars-d at puremagic.com
Sat Sep 12 13:11:54 PDT 2015


On 12-Sep-2015 23:08, 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.
>
>> 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);
>
>

What if we add generic string interpolation a-la:

s"$age > 21 && name = ${someobj.field}"

would translate to:
AliasSeq!("",age," > 21 && name = ", someobj.field, "");

Thoughts? I think it was proposed before by Timothy Cour.

-- 
Dmitry Olshansky


More information about the Digitalmars-d mailing list