From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Barry Margolin Newsgroups: gmane.emacs.help Subject: Re: Declaring a local dynamic variable? Date: Fri, 27 Sep 2013 10:31:19 -0400 Organization: A noiseless patient Spider Message-ID: References: NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1380292515 13750 80.91.229.3 (27 Sep 2013 14:35:15 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 27 Sep 2013 14:35:15 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Fri Sep 27 16:35:19 2013 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1VPZ8X-0001KG-Bq for geh-help-gnu-emacs@m.gmane.org; Fri, 27 Sep 2013 16:35:17 +0200 Original-Received: from localhost ([::1]:36921 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VPZ8W-00011N-SX for geh-help-gnu-emacs@m.gmane.org; Fri, 27 Sep 2013 10:35:16 -0400 Original-Path: usenet.stanford.edu!news.kjsl.com!feeder.erje.net!eu.feeder.erje.net!eternal-september.org!feeder.eternal-september.org!news.eternal-september.org!barmar.motzarella.org!.POSTED!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 60 Injection-Info: barmar.motzarella.org; posting-host="2be9e9f5dd9af768b8861af71b85fc28"; logging-data="5377"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX182orMHATqaYgx0zWNrZybJ" User-Agent: MT-NewsWatcher/3.5.3b3 (Intel Mac OS X) Cancel-Lock: sha1:qwr/KmkNsXGUxiQECWqA7mShDEA= Original-Xref: usenet.stanford.edu gnu.emacs.help:201397 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:93666 Archived-At: In article , Andreas Röhler 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. 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". 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. -- Barry Margolin, barmar@alum.mit.edu Arlington, MA *** PLEASE post questions in newsgroups, not directly to me ***