Re: Variables and closures (Was: Objects and Relations)

From: David BL <davidbl_at_iinet.net.au>
Date: 9 Feb 2007 16:18:14 -0800
Message-ID: <1171066694.511427.112310_at_j27g2000cwj.googlegroups.com>


On Feb 10, 3:42 am, "Marshall" <marshall.spi..._at_gmail.com> wrote:
> On Feb 8, 11:05 pm, "David BL" <davi..._at_iinet.net.au> wrote:
>
>
>
> > In common usage 'variable' is only used with reference to the
> > identifiers in the source that at run time are associated with an
> > instance of some type (whether a global variable, frame variable or
> > member variable).
>
> That's certainly the common usage in the C++ and Java worlds,
> which is perhaps unsurprising since they have specific terminology
> for their first-class variable construct ("object") and there is no
> relationship in the language semantics between their first class
> variables and their second class variables (which they call
> "variables.")

Yes, and the code which Bob commented on was C++

>
> This article descibes the notion of a "first class" construct
> as the term is used in programming language theory:
>
> http://en.wikipedia.org/wiki/First-class_object
>
> (The word "object" in the title above is the generic
> sense of the word, not the OOPL sense.)
>
> In SML, the notion of a name and the notion of a
> variable are completely decoupled. Names
> are always bound to constants, however that
> constant might be the identity of a variable.
>
> Relational language discussions generally omit the
> notion of first class variables, because they aren't
> a great fit with relational semantics. For that reason
> I've mostly tried to avoid the notion of first class
> variables (as well as objects) in my own designs,
> however I've found it impossible to fully discard the
> notion of first class variables, because they crop up
> almost inevitably once we put together two ideas
> each of which are "must-haves" in my humble opinion:
> lexical scope and first-class functions.
>
> Consider:
>
> function make_sequence(initial_value:int):int {
> var x:int = initial_value;
> function sequencer():int {
> return x++;
> }
> return sequencer;
>
> }
>
> The nested function sequencer() closes over the variable
> x declared in the outher scope, a natural consequence of
> lexical scope. The function make_sequence returns a
> sequencer which is bound to a specific instance of x.
>
> Once we put these language features together, we are
> faced with a nasty choice: we have to either put some
> annoyingly artifical limits on its use, or else we have to
> live with the fact that we've just introduced first-class
> variables to our language. Most impure functional
> languages choose the later. I believe that's probably
> the right choice, but I'm still somewhat uneasy about it.
>
> Marshall
Received on Sat Feb 10 2007 - 01:18:14 CET

Original text of this message