"Florian Frank" <flori / nixe.ping.de> wrote in message
news:1098216486.8851.36.camel / lambda.eavesdrop.ping.de...
> On Tue, 2004-10-19 at 20:44, Sam Sungshik Kong wrote:
> > You and Mr. Gross helped me understand what a closure is.
> > Thanks a lot!
> >
> > By the way, where does the name - closure come from?
> > It's not a very intuitive name, IMO.
>
> A closure is a combination of an anonymous function and the
> lexical environment it was created in. You could say it's a closure
> around this lexical environment (=all the current bindings of local
> variables/all the nested environments) at that moment. If you
> have a method like
>
> def foo; end
>
> its lexical environment does only exist while executing the method. But
> you can also return the environment if you for example use
>
> def foo;binding;end
> # => nil
> foo
> # => #<Binding:0x402aed74>
> foo
> # => #<Binding:0x402adf8c>
>
> That opens a lot of possibilities, because you can still hold a
> reference to the environment after the method call was executed. If
> you have real closures you also have object oriented programming.
> A small example is this stack implementation:
>
> def make_stack
>   data = []
>   lambda do |id,*args|
>     case id
>     when :push then data.push *args
>     when :pop then data.pop
>     when :top then data.last
>     end
>   end
> end
> # => nil
>
> s1 = make_stack
> # => #<Proc:0x402af044@(irb):3>
> s2 = make_stack
> # => #<Proc:0x402af044@(irb):3>
> s1[:push, 1, 2, 3]
> # => [1, 2, 3]
> s2[:push, 'a', 'b', 'c']
> # => ["a", "b", "c"]
> s1[:top]
> # => 3
> s2[:top]
> # => "c"
> s2[:pop]
> # => "c"
> s1[:top]
> # => 3
> s2[:top]
> # => "b"
>
> Note that s1 and s2 are two different stack objects, because
> they access a different environment and thus a different data variable.
>

Thank you for the great explanation.
Now I'm close to full understanding...:=)

> You might be interested in reading the wizard book
> http://mitpress.mit.edu/sicp/full-text/book/book.html,
> especially chapter 4, "The Metacircular Evaluator".
>

Wow.
Seems like this book is just what I've been looking for.
Not just for closures but for general concepts of programs.
Thanks.

Sam

> -- 
> _="puts'_='+_.inspect+';'+_";puts'_='+_.inspect+';'+_
>
>
>