Make alias parameter optional?

Jacob Carlborg doob at me.com
Sun Feb 26 03:45:53 PST 2012


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


More information about the Digitalmars-d-learn mailing list