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