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.