OT: on IDEs and code writing on steroids
BCS
ao at pathlink.com
Mon May 18 11:50:03 PDT 2009
Reply to Ary,
> BCS wrote:
>
>> Reply to Ary,
>>
>>> Have you seen Linq? That's *amazing*!
>>>
>> LINQ is the only thing c# has the is a notable language feature, but
>> I don't think it adds anything that puts it much above the rest of
>> the crowd in any way.
>>
>>> You can deal with expression ASTs and do really cool stuff with
>>> that. Like doing:
>>>
>>> var results = someObjectsThatAreGoingToBeTakenFromTheDb.Where(o =>
>>> o.Name == "Foo");
>>>
>> I think this will work:
>>
>> int delegate(int delegate(ref T)) Where(T[] array, bool delegate(T)
>> dg)
>> {
>> struct Ret
>> {
>> T[] Array;
>> bool delegate(T) Dg;
>> int opApply(int delegate(ref T) idg)
>> {
>> foreach(ref T t; Array)
>> if(Dg(t)) if(int ret = idg) return ret;
>> return ret;
>> }
>> return &(Ret(array,dg)).opApply;
>> }
>> }
>> If not, a little tweeking shloudl cover it.
>>
> This is for filtering an array. What this does in C# is to translate
> that code into this (more or less, this is just the idea!):
>
> SqlConnection conn = ...;
> conn.executeQuery("select * from SomeTable Where Name = 'Foo'");
Only for LINQ to SQL (or the like)
all LINQ is is a set of standard nameing conventions and sugar. I Add a "Where"
function to some SQL tabel object and you get the above as well.
> What the "Where" method does it to receieve an expression tree for "o
> => o.Name = 'Foo'", and using a visitor it converts it to an SQL
> statement. In D you don't have expression trees. The best you could do
> it to give it a string, but then you loose autocompletion,
> refactoring, nice compiler error messages and probably many other
> things.
I can see a Where!("Name","Age>")(someName,someAge) being not to hard to
implement. Heck with prepared statements it might even be trivial, maybe
even non templated.
>
> The best thing about this is that the expression is represented using
> a class, say Func<From, To>. So you could say:
>
> Func<From, bool> predicate = (From f) => f.Name == "Foo";
>
> Now you can do:
>
> From[] array = ...;
> array.Where(predicate);
> or:
>
> DbObjects.Where(predicate);
>
> In the first case, the predicate will be executed at run-time for each
> object in the array, much like your D example does. In the second
> case, however, predicate will be translated to SQL.
>
OK you've got me convinced that c# has a cool feature: not LINQ (it's still
ho-hum) but AST reflection.
More information about the Digitalmars-d
mailing list