[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Another question about lexical closures
- To: Rem@IMSSS
- Subject: Another question about lexical closures
- From: Robert W. Kerns <RWK@SCRC-YUKON.ARPA>
- Date: Wed, 15 May 85 16:30 EDT
- Cc: COMMON-LISP@SU-AI.ARPA
- In-reply-to: The message of 15 May 85 05:13-EDT from Rem@IMSSS
Date: 15 May 1985 0213-PDT
From: Rem@IMSSS
There's a little ambiguity about when two bindings are "the same" and when
they are "different" bindings. If you bind exactly the same lexical variable
(in the same function or other executable form) to exactly the same value
(the values are EQ), at two different times, are the two bindings you get
considered to be the same or different?
The way I think of this is "Two calls to LET produce two different
bindings". So if I read your question right, the answer is "different".
I.e. if you make a lexical closure
in function FOO with X bound to NIL and then make another lexical closure
in function FOO with X bound to NIL, will the X-variables in those two
closures be the same variable (sharing side-effects) or not?
I assume here you mean two calls to FOO, not something like
(LET ((X 5))
(VALUES #'(LAMBDA () X) #'(LAMBDA (Y) (SETQ X Y))))
where the answer is "save variable (sharing side effects)"
My guess
is they will be different, that is each time you go into a lambda-binding
you get a "different" binding even if the lexical variable and its value
are the same both times. Am I correct?
Yes.
(Note the example at the bottom of
page 87 doesn't answer this question since TWO-FUNS is called only once.
Indeed, I think this section could use a bit more exposition and further
examples. I think the manual can't help being a bit of a language
tutorial here, and should abandon the tersness of a reference manual,
even if it ends up repeating the same concept in different ways.
If it got called a second time, with exactly the same args, and the result
SETQ'd to global FUNS2, would (CAR FUNS) and (CAR FUNS2) share their
lexical-closure-variable, i.e. "the binding of the variable X created
on entry to the function TWO-FUNS when it was called with argument 6"
as described at the bottom of the page? That phrasing indicates there
WOULD be sharing, but due to what it says on page 37 top "it depends
on the invocaton during which the reference is made" I think it WOULD NOT
be sharing, i.e. wording on page 87 should really say "... on that particular
entry to the function TWO-FUNS ..." even though in that example it is moot
since TWO-FUNS was called only once in the example.)
-------
That's right. There would be sharing between (CAR FUNS) and (CADR FUNS), and
between (CAR FUNS2) and (CADR FUNS2), but not between the elements of FUNS
and FUNS2.