From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: "Pascal J. Bourguignon" Newsgroups: gmane.emacs.help Subject: Re: How to use a symbol and its value to create alist? Date: Wed, 12 Aug 2015 09:03:12 +0200 Organization: Informatimago Message-ID: <87si7pdm4v.fsf@kuiper.lan.informatimago.com> References: <20150811135254.GA20200@debian> <20150811151533.17219.21BE0C0D@ahiker.mooo.com> <874mk5fe5c.fsf@kuiper.lan.informatimago.com> <87zj1xdzc3.fsf@kuiper.lan.informatimago.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1439363136 22187 80.91.229.3 (12 Aug 2015 07:05:36 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 12 Aug 2015 07:05:36 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Wed Aug 12 09:05:27 2015 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 1ZPQ6I-00038D-1Y for geh-help-gnu-emacs@m.gmane.org; Wed, 12 Aug 2015 09:05:26 +0200 Original-Received: from localhost ([::1]:37239 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZPQ6H-0007gB-19 for geh-help-gnu-emacs@m.gmane.org; Wed, 12 Aug 2015 03:05:25 -0400 Original-Path: usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 68 Original-X-Trace: individual.net liEoWzIFXEqwR/2TombOVQlmezfOR8qJJ57ml0skkWgpIEEQEt Cancel-Lock: sha1:NjE0ZTcwNGVkMmI4YWM0NTVhYjE0OWUwOTA5ZjNhNzhhNmM2YTZiOA== sha1:lm32+TGV/tpIOlW9o5e1sS+3WmU= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) Original-Xref: usenet.stanford.edu gnu.emacs.help:214212 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:106495 Archived-At: Navy Cheng writes: >> >> I need to push some global variable to a "stack" and pop them later. If >> >> I don't do like this, the global variables will be changed by program >> > >> > (defvar a 1) >> > (defvar b 2) >> > (defvar cc 3) >> > >> > (defun do-something () >> > (print (list 'before a b cc)) >> > (setf a 0 b 0 cc 0) >> > (print (list 'after a b cc))) >> > >> > (progn >> > (let ((a a) >> > (b b) >> > (cc cc)) >> > (do-something)) >> > (list 'finally a b cc)) >> > prints: >> > >> > (before 1 2 3) >> > >> > (after 0 0 0) >> > --> (finally 1 2 3) >> >> If you have a lot of global variables you want to preserve like this, or >> in a lot of places, you can write a macro: >> >> (defmacro with-saved-variables (variables &rest body) >> `(let ,(mapcar (lambda (var) (list var var)) variables) >> ,@body)) >> >> (progn >> (with-saved-variables (a b cc) >> (do-something)) >> (list 'finally a b cc)) >> prints: >> (before 1 2 3) >> >> (after 0 0 0) >> --> (finally 1 2 3) >> > Thank you for your answers. As I'm not familar with macros in elisp, I think your > first answer is good for me. > > By the way, you define global variable by (defval). But I always use > (setq). What's the difference bewteen (defval) and (setq)? And with > one is recommand to define a global variable? Use emacs! C-h f defvar RET C-h f setq RET It's defvar, not defval. The difference is that defvar DEFINES a variable, ie, it CREATES it, while SETQ doesn't create or define it, it just modifies an EXISTING variable. Also, if the variable already exists, defvar doesn't do anything, so you can easily reload your lisp files without resetting all the variables. -- __Pascal Bourguignon__ http://www.informatimago.com/ “The factory of the future will have only two employees, a man and a dog. The man will be there to feed the dog. The dog will be there to keep the man from touching the equipment.” -- Carl Bass CEO Autodesk