OT: on IDEs and code writing on steroids

Ary Borenszweig ary at esperanto.org.ar
Mon May 18 10:58:30 PDT 2009


BCS wrote:
> Reply to Ary,
> 
>> BCS wrote:
>>
>>> Reply to Andrei,
>>>
>>>> I've repeatedly failed to figure out the coolness of C#, and would
>>>> appreciate a few pointers. Or references. Or delegates :o).
>>>>
>>> The coolness of c# is that (in order, IMHO) 1) the tools are world
>>> class, 2) the support is back by MS, 3) the docs are great, and 4)
>>> the language is highly consistent and conservative, e.i. nothing is
>>> added until they've got it right.
>>>
>>> Aside from #4, the *language* isn't anything to write home about.
>>>
>> 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'");

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.

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.



More information about the Digitalmars-d mailing list