On Feb 16, 2009, at 10:34 AM, Stuart Halloway wrote:
>
> David Sletten sent me this erratum:
>
> <<
> At the beginning of section 2.4 we have "The symbol user/foo refers to
> a var which is bound to the value 10." Under the next subsection
> "Bindings" we have "Vars are bound to names, but there are other kinds
> of bindings as well." The Common Lisp standard defines a binding as
> "an association between a name and that which the name denotes". This
> is the second sense used in the book. The first sense of a "binding"
> between a var and its value is inconsistent.
>>>
>
> Should I be using two different terms, or is the notion of binding
> overloaded?
>
>
Stuart,
I'm sorry but my comments appear to have raised more of a fuss than I
intended. I think I need to clarify two issues:
1. I was probably not sufficiently clear in my intent. I did not mean
so much to point out that you were wrong as to simply highlight the
"inconsistent" use of the words "binding" and "bound". Your term
"overloaded" is more neutral, and therefore a better choice than mine.
In a language such as Common Lisp where every variable is
(effectively) a reference variable, we have three concepts: names,
variables (references), and values (referents). These three things
have two connections. In an orthodox (perhaps pedantic) sense a name
is "bound" to a variable, and the variable "has" a value. Names can
be bound to different variables and variables can be assigned new
values:
(defvar *x* 8) ; Bind "*x*" to special variable and assign value.
(setf *x* 9) ; Assign new value to variable. Binding hasn't changed.
(let ((x 12)) ; Bind "x" to variable, assign value.
(let ((x "pung")) ; Bind "x" to different variable -> different
binding.
(setf x "foo") ; Same (2nd) variable, new value.
...) ; 1st binding visible again outside of inner LET
...) ; No more binding for "x" out here
On a side note, when we talk of scope we shouldn't talk about an
"identifier's scope" or a "variable's scope". Scope is an issue
involving both names and variables: bindings have scope.
The definitions in the CLHS glossary all reflect this interpretation.
However, as I was looking through my notes it became clear that your
overloaded use is hardly idiosyncratic. For example, the CLHS entry
for LET states: "let and let* create new variable bindings and
execute a series of forms that use these bindings." Yet it explicitly
states later that: "...Then all of the variables varj are bound to
the corresponding values". This seems to me inconsistent with the
glossary definitions, but such usage occurs throughout the Standard.
I think that the strict usage is consistent with Clojure's "binding"
macro, which binds a name to a new variable. The "let" special form
does a similar thing, but the situation is a little different than in
CL since you can't assign a new value to a "variable" established by
a Clojure let binding. Consequently, it seems that we can more safely
blur the distinctions among name/variable/value here. A name is
associated with a given value for the lifetime of the binding.
As another example, the language Oz has the notion of identifiers,
which may be either bound or free, and variables, which may either be
bound or unbound. Oz variables are like Clojure lexicals--once
assigned their values cannot change. So an unbound variable is simply
a variable that has not been assigned a value yet. Assignment "binds"
a value to a variable. Likewise, a free identifier is a name that
doesn't refer to anything yet. Once bound, an identifier names a
variable.
So to wrap this all up, if you are satisfied with your discussion in
the book--and you seem justified in that--then I'll just shut up
about binding.
2. My erratum report and comments above should not be viewed as
though I advocate Clojure being evaluated through the lens of Common
Lisp. I have a few years experience studying CL, so naturally that
affects my perception of Clojure. However, in fairness the language
should be judged on its own merits, and I am far too new to Clojure
to make any such judgment yet.
Aloha,
David Sletten
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---