[gambit-list] Android Gambit Error
Joe Doyle Ardent
ardent at nebcorp.com
Thu Sep 15 20:46:49 EDT 2011
On Wed, Sep 14, 2011 at 08:02:33PM -0700, Steve Graham wrote:
>
> On a final note, I am mystified as to how the code works. This is an
> example of it being defined and run on my Windows 7x64 machine:
>
> Gambit v4.6.1
>
> > (define (counter)
> (let ((value 0))
> (lambda ()
> (set! value (+ value 1))
> value)))
> > (define first-counter (counter))
> > (first-counter)
> 1
> > (first-counter)
> 2
> > (first-counter)
> 3
> > (first-counter)
> 4
> >
>
> It seems to initialize value to 0 and I assume that happens the first
> time you use (counter) to define another form. What I don't
> understand is why the code for initializing is skipped every time
> (first-counter) is run.
>
To be clear: the identifier "first-counter" is bound to a
procedure, defined by lambda statement. The lambda captures the initial
value of "counter" when it is defined. But when you call
(first-counter), it's not going through the codepath that includes
the let statement. It's just executing the lambda code, which has
captured the state of "counter", and that state persists as long as its
enclosing lambda does (the lambda "closes over" counter; that's why it's
called a "closure").
You can think of counter as a private data member in an OO Algol
language.
-Joe
More information about the Gambit-list
mailing list