On 02/26/2012 03:45 AM, Jacob Carlborg wrote:
> 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");
> };
> }
>I see, thanks. The reason I thought about ranges is that the yield statement in the Ruby code above reminded me of Python's generators, and that D's ranges can also take the role of generators.
Ali
