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: Lexical binding and macros. Date: Wed, 15 Dec 2010 18:37:12 +0100 Organization: Informatimago Message-ID: <87tyifx7hz.fsf@kuiper.lan.informatimago.com> References: <87r5dmkir6.fsf@kuiper.lan.informatimago.com> <96134923-1314-4675-bd77-004945a7159e@y3g2000vbm.googlegroups.com> <87vd2v8107.fsf@lola.goethe.zz> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: dough.gmane.org 1292435052 21266 80.91.229.12 (15 Dec 2010 17:44:12 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 15 Dec 2010 17:44:12 +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 Dec 15 18:44:06 2010 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1PSvOV-0004ou-Cj for geh-help-gnu-emacs@m.gmane.org; Wed, 15 Dec 2010 18:44:06 +0100 Original-Received: from localhost ([127.0.0.1]:53367 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PSvOH-0007EB-J5 for geh-help-gnu-emacs@m.gmane.org; Wed, 15 Dec 2010 12:43:49 -0500 Original-Path: usenet.stanford.edu!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 79 Original-X-Trace: individual.net nSgzSexkAbUFWdXOKxCkJQBs5WC1u7Tx7aWLYlfQdNexpwhLBI Cancel-Lock: sha1:OTljOWZjZThlM2YwNzIzMGY2ZjNkMzY0MjJmYjkzMTI0NDZhOWRkOA== sha1:F8lVDU0aUAEhsx388Hxf+UXGi7k= Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9 033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR mV+hO/VvFAAAAABJRU5ErkJggg== X-Accept-Language: fr, es, en X-Disabled: X-No-Archive: no Importance: high User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) Original-Xref: usenet.stanford.edu gnu.emacs.help:183320 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:77563 Archived-At: David Kastrup writes: > Stefan Monnier writes: > >>> Do they still leak memory? From http://c2.com/cgi/wiki?EmacsLisp : >> >>> "Note that variables bound with lexical-let are never released, even >>> if they are never used. Try >> >>> (loop for i from 1 to 100000 collect (lexical-let ((x i)) '())) >> >>> and watch it eat memory. So making infinity (ZeroOneInfinity) lexical >>> variables is out of the question except for very small values of >>> infinity." >> >> Additionally to what Pascal already explained, I'll add that, >> lexical-let, like `loop' are relatively heavy macros, so you definitely >> don't want to run them interpreted (where the macro is re-expanded each >> time). > > Why would they be reexpanded each time? They are macros. Their > expansion is done once and merely evalled each time. > > Or do I misunderstand something here? In the case of Common Lisp, implementations providing an interpreter are allowed to macro expand everytime. Most implementations do cache the expansion however. (A lot of CL implementations just compile everything automatically anyways). For example, clisp performs the macroexpansions when defining the function, and one time again when compiling it: CL-USER> (defmacro m (x) (format t "(m ~S) is expanded" x) `(list ',x ',x)) M CL-USER> (defun f () (m 1)) (m 1) is expanded F CL-USER> (list (f) (f) (f)) ((1 1) (1 1) (1 1)) CL-USER> (compile 'f) (m 1) is expanded F NIL NIL CL-USER> In the case of emacs 23.2.1, (defmacro m (x) (message "(m %S) is expanded" x) `(list ',x ',x)) (defun f () (m 1)) (list (f) (f) (f)) --> ((1 1) (1 1) (1 1)) produces in *Messages*: (m 1) is expanded [3 times] So it looks like the emacs lisp interpreter doesn't not cache the macro expansions. emacs lisp expands it once more when compiling the function too: (byte-compile 'f) --> #[nil "\300\211D\207" [1] 2] *Messages*: (m 1) is expanded -- __Pascal Bourguignon__ http://www.informatimago.com/ A bad day in () is better than a good day in {}.