On 2012-02-26 11:03, Ali Çehreli wrote:
On 02/25/2012 05: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:

...

 >>> 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.
 >

I don't know Ruby but from what I've read so far about Ruby blocks,
their D equivalents may also be D ranges.

Ali

A Ruby block is basically like a delegate in D and has nothing to do with ranges.

Ruby:

def foo (&block)
    block.call
end

foo do
    p "asd"
end

D:

void foo (void delegate () block)
{
    block();
}

void main ()
{
    foo({
        writeln("asd");
    });

    foo(() => writeln("asd")); // new lambda syntax
}

Both examples print "asd". If you want to have a more Ruby looking syntax in D you do some operator overload abuse:

struct Block
{
    void delegate (void delegate ()) impl;

    void opIn (void delegate () block)
    {
        impl(block);
    }
}

Block foo ()
{
    return Block((x) => x());
}

void main ()
{
    foo in {
        writeln("asd");
    };
}

--
/Jacob Carlborg

Reply via email to