[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
progv and dynamic variables
- To: "Timothy P. Daly" <DALY@IBM.COM>
- Subject: progv and dynamic variables
- From: BROOKS%OZ.AI.MIT.EDU@XX.LCS.MIT.EDU
- Date: Tue, 02 Dec 1986 02:04:00 -0000
- Cc: common-lisp@SU-AI.ARPA
- In-reply-to: Msg of 1 Dec 1986 13:53:21 EST from Timothy P. Daly <DALY at ibm.com>
What should the following do:
(defun foo (a s v)
(progv s v (print a)))
with:
(foo 3 '(a) '(4))
The actual result is 3 but from the book description of PROGV
on p112 it appears that it should be 4. I have tried this on
3 different common lisps with the same result.
The `a' in (print a) refers to the lexical variable `a' named in
foo's parameter list. The progv binds the dynamic variable `a'.
You can get the answer to be 4 a number of ways:
1.
(defvar a)
(defun foo (a s v)
(progv s v (print a)))
This makes all references to `a' pervasively dynamic so even
the call to foo binds the dynamic `a'.
2.
(defun foo (a s v)
(declare (special a))
(progv s v (print a)))
Has the same effect on foo, but other functions can use a lexically
scoped `a'.
3.
(defun foo (a s v)
(progv s v
(declare (special a))
(print a)))
The binding of `a' during the call to foo is lexical, but the
reference in (print a) is dynamic.