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