On 2/25/12 10:04 PM, Robert Rouse wrote:
On Saturday, 25 February 2012 at 23:10:51 UTC, Ary Manzana wrote:
On 2/25/12 7:31 PM, Robert Rouse wrote:


On Saturday, 25 February 2012 at 22:12:55 UTC, Ali Çehreli wrote:
On 02/25/2012 01:55 PM, Robert Rouse wrote:
On Saturday, 25 February 2012 at 18:54:35 UTC, Trass3r wrote:
void foo(T, T2, alias thing = (){})(T a, T2 b)
{
thing();
}

void bar(){}

void main()
{
foo!(int,int,bar)(1,2);
foo(1,2);
}

Cool. Didn't know you can do that, but I guess it makes sense that it
would work that way.

The only thing I wish for is if I didn't have to explicitly define
what
T and T2 were and I could just do

foo!(bar)(1,2);

The following works and is news to me. Apparently template parameters
with default values need not be at the end of the template parameter
list:

void foo(alias thing = (){}, T, T2)(T a, T2 b)
{
thing();
}

void bar(){}

void main()
{
foo!(bar)(1,2);
}

Ali

This means that D can simulate Ruby blocks more than I thought. That's
pretty awesome. I'm loving D more every day.

How's that like a Ruby block?

The D code simulates the following Ruby if you were to make bar print
"something" with writeln.

def foo(a, b, &block)
puts "a is #{a}")
b.call
yield
end

f = lambda { puts "good bye" }

foo(1, f) { puts "something" }


That's what I'm talking about.


A Ruby block is much more than a delegate, because you can assign variables outside of the block and even returning from a block returns from the function that invokes it. I don't see how D can accomplish that.

Here's some more about it: http://yehudakatz.com/2012/01/10/javascript-needs-blocks/

Reply via email to