[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Declaring a local dynamic variable?
From: |
Andreas Röhler |
Subject: |
Re: Declaring a local dynamic variable? |
Date: |
Fri, 27 Sep 2013 20:48:34 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 |
Am 27.09.2013 16:31, schrieb Barry Margolin:
In article <mailman.2982.1380275511.10748.help-gnu-emacs@gnu.org>,
Andreas Röhler <andreas.roehler@easy-emacs.de> wrote:
Am 25.09.2013 20:53, schrieb Stefan Monnier:
So in essence Emacs doesn't really have local dynamic variables?
Dynamic scoping is inherently global, whether in Elisp or in any other
language.
Not in Common Lisp.
(defun d1 ()
(let ((var 1))
(declare (special var))
(l1)))
(defun l1 ()
(let ((var 2))
(print var)
(d2)))
(defun d2 ()
(declare (special var))
(print var))
D1 and D2 use the dynamic variable VAR, L1 uses the lexical variable VAR.
Same in Elisp. But if d1 and d2 are in two separate packages that know
nothing about each other but who happen to call each other through some
potentially twisted sequence of calls, they will still interfere,
because there's only (globally) one dynamic variable by that name.
Now if two separate packages define a lexical var with the very same, is such
a confusion excluded?
Yes. By definition, lexical variables are only visible in the lexical
contour, not in other functions.
I'm afraid it's not about definition, as let-bound variables should not be
inherently global,
Let's memorize Stefan's remark as a starting-point to work-on:
" But if d1 and d2 are in two separate packages that know
nothing about each other but who happen to call each other through some
potentially twisted sequence of calls, they will still interfere,
because there's only (globally) one dynamic variable by that name."
Would like to see such a twisted sequence and what makes it's different from a
common bug.
The exception is if a macro expands into code that binds the variable:
(defmacro pkg1-m (&body b)
`(let ((var 'm))
,@b))
(defun pkg2-f ()
(let ((var 'f))
(pkg1-m
(print var))))
(pkg2-f) will print "m" rather than "f".
Mmm, maybe I don't understand, but that wouldn't surprise me, because pkg1-m
re-binds it(?)
This is generally referred to as the "hygiene" problem in macros. It's
why macros should use gensym to create the local variables used in the
expansion, or take the variable as a parameter. Dialects like Scheme
have built-in mechanisms to create hygienic macros.
- Re: Declaring a local dynamic variable?, (continued)
- Re: Declaring a local dynamic variable?, Joost Kremers, 2013/09/25
- Re: Declaring a local dynamic variable?, Stefan Monnier, 2013/09/25
- Message not available
- Re: Declaring a local dynamic variable?, Barry Margolin, 2013/09/25
- Re: Declaring a local dynamic variable?, Stefan Monnier, 2013/09/25
- Re: Declaring a local dynamic variable?, Andreas Röhler, 2013/09/27
- Re: Declaring a local dynamic variable?, Stefan Monnier, 2013/09/27
- Message not available
- Re: Declaring a local dynamic variable?, Barry Margolin, 2013/09/27
- Re: Declaring a local dynamic variable?,
Andreas Röhler <=
- Message not available
- Re: Declaring a local dynamic variable?, Pascal J. Bourguignon, 2013/09/27
- Re: Declaring a local dynamic variable?, Stefan Monnier, 2013/09/27
- Re: Declaring a local dynamic variable?, Andreas Röhler, 2013/09/28
- Re: Declaring a local dynamic variable?, W. Greenhouse, 2013/09/28
- Re: Declaring a local dynamic variable?, Andreas Röhler, 2013/09/28
- Re: Declaring a local dynamic variable?, W. Greenhouse, 2013/09/28
- Message not available
- Re: Declaring a local dynamic variable?, Barry Margolin, 2013/09/25