On Tue, Aug 01, 2006 at 09:50:23AM +0900, Logan Capaldo wrote: > > On Jul 31, 2006, at 6:48 PM, Chad Perrin wrote: > > >On Tue, Aug 01, 2006 at 07:05:31AM +0900, Logan Capaldo wrote: > >> > >>On Jul 31, 2006, at 5:13 PM, Chad Perrin wrote: > >> > >>>On Tue, Aug 01, 2006 at 04:57:48AM +0900, Logan Capaldo wrote: > >>>> > >>>>All these examples are lexical scoping. Ruby doesn't really have > >>>>dynamic scoping although you can sort of abuse instance > >>>>variables to > >>>>achieve similar effects. > >>>> > >>>>The difference is that blocks are closures, where def, class, and > >>>>module aren't. > >>> > >>>Wait . . . you mean that *all blocks* are automagically lexical > >>>closures, as though declared lexical variables within them have > >>>gone out > >>>of scope? I imagine I'm probably misunderstanding you, but if not, > >>>that's a pretty nifty bit of trickery. > >>> > >>I'm not sure I understand your question. All blocks (by blocks I mean > >>do / end and { } ) are (lexically scoped) closures. > > > >I'll use a Perl example: > > > >sub foo { > > my $bar = 1; > > return sub { print ++$bar }; > >} > > > >my $baz = foo(); > > > >Voila. $baz contains a lexical closure. This is the case because the > >return value from foo() was lexically "closed" by virtue of $bar going > >out of scope, but its value still being accessible via the coderef > >returned from foo() and assigned to $baz. > > > > Yes. It is just like perl. > > % cat closure.rb > def foo > bar = 1 > lambda { puts (bar += 1) } > end > > baz = foo() > > baz.call > baz.call > > % ruby closure.rb > -:13: warning: don't put space before argument parentheses > 2 > 3 Okay. Looks like a closure. It looks like a closure because of the relationship of bar to the return-value block of code. I've been told that all blocks are closures, though -- and I don't see how it's still a closure if the "bar = 1" is removed from foo. -- CCD CopyWrite Chad Perrin [ http://ccd.apotheon.org ] "It's just incredible that a trillion-synapse computer could actually spend Saturday afternoon watching a football game." - Marvin Minsky